From 6e283c53109f0fff90bdc62ddcf063b7776a56b7 Mon Sep 17 00:00:00 2001 From: sh0rez Date: Tue, 29 Oct 2019 22:09:03 +0100 Subject: [PATCH] test: jsonnetfile marshalling --- pkg/jsonnetfile/jsonnetfile.go | 6 +- pkg/jsonnetfile/jsonnetfile_test.go | 24 +++--- spec/spec.go | 13 ++++ spec/spec_test.go | 109 ++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 15 deletions(-) create mode 100644 spec/spec_test.go diff --git a/pkg/jsonnetfile/jsonnetfile.go b/pkg/jsonnetfile/jsonnetfile.go index da9875e..a6cb124 100644 --- a/pkg/jsonnetfile/jsonnetfile.go +++ b/pkg/jsonnetfile/jsonnetfile.go @@ -18,7 +18,6 @@ import ( "encoding/json" "io/ioutil" "os" - "path/filepath" "github.com/pkg/errors" @@ -32,9 +31,9 @@ const ( var ErrNoFile = errors.New("no jsonnetfile") - +// Load reads a jsonnetfile.(lock).json from disk func Load(filepath string) (spec.JsonnetFile, error) { - m := spec.JsonnetFile{} + m := spec.New() bytes, err := ioutil.ReadFile(filepath) if err != nil { @@ -51,6 +50,7 @@ func Load(filepath string) (spec.JsonnetFile, error) { return m, nil } +// Exists returns whether the file at the given path exists func Exists(path string) (bool, error) { _, err := os.Stat(path) if os.IsNotExist(err) { diff --git a/pkg/jsonnetfile/jsonnetfile_test.go b/pkg/jsonnetfile/jsonnetfile_test.go index c74f6ab..76a0230 100644 --- a/pkg/jsonnetfile/jsonnetfile_test.go +++ b/pkg/jsonnetfile/jsonnetfile_test.go @@ -18,7 +18,6 @@ import ( "io/ioutil" "os" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" @@ -30,7 +29,7 @@ import ( const notExist = "/this/does/not/exist" func TestLoad(t *testing.T) { - empty := spec.JsonnetFile{} + empty := spec.New() jsonnetfileContent := `{ "dependencies": [ @@ -48,17 +47,18 @@ func TestLoad(t *testing.T) { } ` jsonnetFileExpected := spec.JsonnetFile{ - Dependencies: []spec.Dependency{{ - Name: "foobar", - Source: spec.Source{ - GitSource: &spec.GitSource{ - Remote: "https://github.com/foobar/foobar", - Subdir: "", + Dependencies: map[string]spec.Dependency{ + "foobar": { + Name: "foobar", + Source: spec.Source{ + GitSource: &spec.GitSource{ + Remote: "https://github.com/foobar/foobar", + Subdir: "", + }, }, - }, - Version: "master", - DepSource: "", - }}, + Version: "master", + DepSource: "", + }}, } { diff --git a/spec/spec.go b/spec/spec.go index 00e9e45..6d1bf2c 100644 --- a/spec/spec.go +++ b/spec/spec.go @@ -19,14 +19,26 @@ import ( "sort" ) +// JsonnetFile is the structure of a `.json` file describing a set of jsonnet +// dependencies. It is used for both, the jsonnetFile and the lockFile. type JsonnetFile struct { Dependencies map[string]Dependency } +// New returns a new JsonnetFile with the dependencies map initialized +func New() JsonnetFile { + return JsonnetFile{ + Dependencies: make(map[string]Dependency), + } +} + +// jsonFile is the json representation of a JsonnetFile, which is different for +// compatibility reasons. type jsonFile struct { Dependencies []Dependency `json:"dependencies"` } +// UnmarshalJSON unmarshals a `jsonFile`'s json into a JsonnetFile func (jf *JsonnetFile) UnmarshalJSON(data []byte) error { var s jsonFile if err := json.Unmarshal(data, &s); err != nil { @@ -40,6 +52,7 @@ func (jf *JsonnetFile) UnmarshalJSON(data []byte) error { return nil } +// MarshalJSON serializes a JsonnetFile into json of the format of a `jsonFile` func (jf JsonnetFile) MarshalJSON() ([]byte, error) { var s jsonFile for _, d := range jf.Dependencies { diff --git a/spec/spec_test.go b/spec/spec_test.go new file mode 100644 index 0000000..3b7607f --- /dev/null +++ b/spec/spec_test.go @@ -0,0 +1,109 @@ +// Copyright 2018 jsonnet-bundler authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package spec + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const jsonJF = `{ + "dependencies": [ + { + "name": "grafana-builder", + "source": { + "git": { + "remote": "https://github.com/grafana/jsonnet-libs", + "subdir": "grafana-builder" + } + }, + "version": "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", + "sum": "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=" + }, + { + "name": "prometheus-mixin", + "source": { + "git": { + "remote": "https://github.com/prometheus/prometheus", + "subdir": "documentation/prometheus-mixin" + } + }, + "version": "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", + "sum": "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=" + } + ] +}` + +func testData() JsonnetFile { + return JsonnetFile{ + Dependencies: map[string]Dependency{ + "grafana-builder": { + Name: "grafana-builder", + Source: Source{ + GitSource: &GitSource{ + Remote: "https://github.com/grafana/jsonnet-libs", + Subdir: "grafana-builder", + }, + }, + Version: "54865853ebc1f901964e25a2e7a0e4d2cb6b9648", + Sum: "ELsYwK+kGdzX1mee2Yy+/b2mdO4Y503BOCDkFzwmGbE=", + }, + "prometheus-mixin": { + Name: "prometheus-mixin", + Source: Source{ + GitSource: &GitSource{ + Remote: "https://github.com/prometheus/prometheus", + Subdir: "documentation/prometheus-mixin", + }, + }, + Version: "7c039a6b3b4b2a9d7c613ac8bd3fc16e8ca79684", + Sum: "bVGOsq3hLOw2irNPAS91a5dZJqQlBUNWy3pVwM4+kIY=", + }, + }, + } +} + +// TestUnmarshal checks that unmarshalling works +func TestUnmarshal(t *testing.T) { + var dst JsonnetFile + err := json.Unmarshal([]byte(jsonJF), &dst) + require.NoError(t, err) + assert.Equal(t, testData(), dst) +} + +// TestMarshal checks that marshalling works +func TestMarshal(t *testing.T) { + data, err := json.Marshal(testData()) + require.NoError(t, err) + assert.JSONEq(t, jsonJF, string(data)) +} + +// TestRemarshal checks that unmarshalling a previously marshalled object yields +// the same object +func TestRemarshal(t *testing.T) { + jf := testData() + + data, err := json.Marshal(jf) + require.NoError(t, err) + + var dst JsonnetFile + err = json.Unmarshal(data, &dst) + require.NoError(t, err) + + assert.Equal(t, jf, dst) +}