mirror of
https://github.com/TECHNOFAB11/jsonnet-bundler.git
synced 2025-12-11 23:50:05 +01:00
test: jsonnetfile marshalling
This commit is contained in:
parent
1caefa556e
commit
6e283c5310
4 changed files with 137 additions and 15 deletions
|
|
@ -18,7 +18,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
|
||||||
|
|
@ -32,9 +31,9 @@ const (
|
||||||
|
|
||||||
var ErrNoFile = errors.New("no jsonnetfile")
|
var ErrNoFile = errors.New("no jsonnetfile")
|
||||||
|
|
||||||
|
// Load reads a jsonnetfile.(lock).json from disk
|
||||||
func Load(filepath string) (spec.JsonnetFile, error) {
|
func Load(filepath string) (spec.JsonnetFile, error) {
|
||||||
m := spec.JsonnetFile{}
|
m := spec.New()
|
||||||
|
|
||||||
bytes, err := ioutil.ReadFile(filepath)
|
bytes, err := ioutil.ReadFile(filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -51,6 +50,7 @@ func Load(filepath string) (spec.JsonnetFile, error) {
|
||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Exists returns whether the file at the given path exists
|
||||||
func Exists(path string) (bool, error) {
|
func Exists(path string) (bool, error) {
|
||||||
_, err := os.Stat(path)
|
_, err := os.Stat(path)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
|
@ -30,7 +29,7 @@ import (
|
||||||
const notExist = "/this/does/not/exist"
|
const notExist = "/this/does/not/exist"
|
||||||
|
|
||||||
func TestLoad(t *testing.T) {
|
func TestLoad(t *testing.T) {
|
||||||
empty := spec.JsonnetFile{}
|
empty := spec.New()
|
||||||
|
|
||||||
jsonnetfileContent := `{
|
jsonnetfileContent := `{
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
|
|
@ -48,17 +47,18 @@ func TestLoad(t *testing.T) {
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
jsonnetFileExpected := spec.JsonnetFile{
|
jsonnetFileExpected := spec.JsonnetFile{
|
||||||
Dependencies: []spec.Dependency{{
|
Dependencies: map[string]spec.Dependency{
|
||||||
Name: "foobar",
|
"foobar": {
|
||||||
Source: spec.Source{
|
Name: "foobar",
|
||||||
GitSource: &spec.GitSource{
|
Source: spec.Source{
|
||||||
Remote: "https://github.com/foobar/foobar",
|
GitSource: &spec.GitSource{
|
||||||
Subdir: "",
|
Remote: "https://github.com/foobar/foobar",
|
||||||
|
Subdir: "",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
Version: "master",
|
||||||
Version: "master",
|
DepSource: "",
|
||||||
DepSource: "",
|
}},
|
||||||
}},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
|
||||||
13
spec/spec.go
13
spec/spec.go
|
|
@ -19,14 +19,26 @@ import (
|
||||||
"sort"
|
"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 {
|
type JsonnetFile struct {
|
||||||
Dependencies map[string]Dependency
|
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 {
|
type jsonFile struct {
|
||||||
Dependencies []Dependency `json:"dependencies"`
|
Dependencies []Dependency `json:"dependencies"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON unmarshals a `jsonFile`'s json into a JsonnetFile
|
||||||
func (jf *JsonnetFile) UnmarshalJSON(data []byte) error {
|
func (jf *JsonnetFile) UnmarshalJSON(data []byte) error {
|
||||||
var s jsonFile
|
var s jsonFile
|
||||||
if err := json.Unmarshal(data, &s); err != nil {
|
if err := json.Unmarshal(data, &s); err != nil {
|
||||||
|
|
@ -40,6 +52,7 @@ func (jf *JsonnetFile) UnmarshalJSON(data []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalJSON serializes a JsonnetFile into json of the format of a `jsonFile`
|
||||||
func (jf JsonnetFile) MarshalJSON() ([]byte, error) {
|
func (jf JsonnetFile) MarshalJSON() ([]byte, error) {
|
||||||
var s jsonFile
|
var s jsonFile
|
||||||
for _, d := range jf.Dependencies {
|
for _, d := range jf.Dependencies {
|
||||||
|
|
|
||||||
109
spec/spec_test.go
Normal file
109
spec/spec_test.go
Normal file
|
|
@ -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)
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue