| package cfg |
| |
| import ( |
| "testing" |
| |
| "github.com/sdboyer/gps" |
| |
| "gopkg.in/yaml.v2" |
| ) |
| |
| var lyml = ` |
| package: fake/testing |
| description: foo bar baz |
| homepage: https://example.com |
| license: MIT |
| owners: |
| - name: foo |
| email: bar@example.com |
| homepage: https://example.com |
| import: |
| - package: github.com/kylelemons/go-gypsy |
| subpackages: |
| - yaml |
| # Intentionally left spaces at end of next line. |
| - package: github.com/Masterminds/convert |
| repo: git@github.com:Masterminds/convert.git |
| vcs: git |
| ref: a9949121a2e2192ca92fa6dddfeaaa4a4412d955 |
| subpackages: |
| - color |
| - nautical |
| - radial |
| os: |
| - linux |
| arch: |
| - i386 |
| - arm |
| - package: github.com/Masterminds/structable |
| version: v1.0.0 |
| - package: github.com/Masterminds/cookoo/color |
| - package: github.com/Masterminds/cookoo/convert |
| |
| testImport: |
| - package: github.com/kylelemons/go-gypsy |
| ` |
| |
| var yml = ` |
| package: fake/testing |
| description: foo bar baz |
| homepage: https://example.com |
| license: MIT |
| owners: |
| - name: foo |
| email: bar@example.com |
| homepage: https://example.com |
| dependencies: |
| - package: github.com/kylelemons/go-gypsy |
| version: v1.0.0 |
| - package: github.com/Masterminds/convert |
| repo: git@github.com:Masterminds/convert.git |
| version: a9949121a2e2192ca92fa6dddfeaaa4a4412d955 |
| - package: github.com/Masterminds/structable |
| branch: master |
| - package: github.com/Masterminds/cookoo |
| repo: git://github.com/Masterminds/cookoo |
| - package: github.com/sdboyer/gps |
| version: ^v1.0.0 |
| |
| testDependencies: |
| - package: github.com/Sirupsen/logrus |
| version: ~v1.0.0 |
| ` |
| |
| func TestManualConfigFromYaml(t *testing.T) { |
| cfg := &Config{} |
| err := yaml.Unmarshal([]byte(yml), &cfg) |
| if err != nil { |
| t.Errorf("Unable to Unmarshal config yaml") |
| } |
| |
| found := make(map[string]bool) |
| for _, i := range cfg.Imports { |
| found[i.Name] = true |
| |
| switch i.Name { |
| case "github.com/kylelemons/go-gypsy": |
| ref := "v1.0.0" |
| if i.Version != ref { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version) |
| } |
| |
| case "github.com/Masterminds/convert": |
| ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955" |
| if i.Version != ref { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version) |
| } |
| |
| repo := "git@github.com:Masterminds/convert.git" |
| if i.Repository != repo { |
| t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository) |
| } |
| |
| case "github.com/Masterminds/structable": |
| ref := "master" |
| if i.Branch != ref { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Branch) |
| } |
| |
| case "github.com/Masterminds/cookoo": |
| repo := "git://github.com/Masterminds/cookoo" |
| if i.Repository != repo { |
| t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository) |
| } |
| |
| case "github.com/sdboyer/gps": |
| sv := "^v1.0.0" |
| if i.Version != sv { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, sv, i.Version) |
| } |
| } |
| } |
| |
| names := []string{ |
| "github.com/Masterminds/convert", |
| "github.com/Masterminds/cookoo", |
| "github.com/Masterminds/structable", |
| "github.com/kylelemons/go-gypsy", |
| "github.com/sdboyer/gps", |
| } |
| |
| for _, n := range names { |
| if !found[n] { |
| t.Errorf("Could not find config entry for %s", n) |
| |
| } |
| } |
| |
| if len(cfg.DevImports) != 1 { |
| t.Errorf("Expected 1 entry in DevImports, got %v", len(cfg.DevImports)) |
| } else { |
| ti := cfg.DevImports[0] |
| n := "github.com/Sirupsen/logrus" |
| if ti.Name != n { |
| t.Errorf("Expected test dependency to be %s, got %s", n, ti.Name) |
| } |
| |
| sv := "~v1.0.0" |
| if ti.Version != sv { |
| t.Errorf("(%s) Expected %q for constraint, got %q", ti.Name, sv, ti.Version) |
| } |
| } |
| |
| if cfg.Name != "fake/testing" { |
| t.Errorf("Inaccurate name found %s", cfg.Name) |
| } |
| |
| if cfg.Description != "foo bar baz" { |
| t.Errorf("Inaccurate description found %s", cfg.Description) |
| } |
| |
| if cfg.Home != "https://example.com" { |
| t.Errorf("Inaccurate homepage found %s", cfg.Home) |
| } |
| |
| if cfg.License != "MIT" { |
| t.Errorf("Inaccurate license found %s", cfg.License) |
| } |
| |
| } |
| |
| func TestLegacyManualConfigFromYaml(t *testing.T) { |
| cfg := &lConfig1{} |
| err := yaml.Unmarshal([]byte(lyml), &cfg) |
| if err != nil { |
| t.Errorf("Unable to Unmarshal config yaml") |
| } |
| |
| if cfg.Name != "fake/testing" { |
| t.Errorf("Inaccurate name found %s", cfg.Name) |
| } |
| |
| if cfg.Description != "foo bar baz" { |
| t.Errorf("Inaccurate description found %s", cfg.Description) |
| } |
| |
| if cfg.Home != "https://example.com" { |
| t.Errorf("Inaccurate homepage found %s", cfg.Home) |
| } |
| |
| if cfg.License != "MIT" { |
| t.Errorf("Inaccurate license found %s", cfg.License) |
| } |
| |
| found := false |
| found2 := false |
| for _, i := range cfg.Imports { |
| if i.Name == "github.com/Masterminds/convert" { |
| found = true |
| ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955" |
| if i.Reference != ref { |
| t.Errorf("Config reference for cookoo is inaccurate. Expected '%s' found '%s'", ref, i.Reference) |
| } |
| } |
| |
| if i.Name == "github.com/Masterminds/cookoo" { |
| found2 = true |
| if i.Subpackages[0] != "color" { |
| t.Error("Dependency separating package and subpackage not working") |
| } |
| } |
| } |
| if !found { |
| t.Error("Unable to find github.com/Masterminds/convert") |
| } |
| if !found2 { |
| t.Error("Unable to find github.com/Masterminds/cookoo") |
| } |
| } |
| |
| func TestClone(t *testing.T) { |
| cfg := &Config{} |
| err := yaml.Unmarshal([]byte(yml), &cfg) |
| if err != nil { |
| t.Errorf("Unable to Unmarshal config yaml") |
| } |
| |
| cfg2 := cfg.Clone() |
| if cfg2.Name != "fake/testing" { |
| t.Error("Config cloning failed") |
| } |
| if cfg2.License != "MIT" { |
| t.Error("Config cloning failed to copy License") |
| } |
| cfg.Name = "foo" |
| |
| if cfg.Name == cfg2.Name { |
| t.Error("Cloning Config name failed") |
| } |
| } |
| |
| func TestLegacyConfigAutoconvert(t *testing.T) { |
| c, leg, err := ConfigFromYaml([]byte(lyml)) |
| if err != nil { |
| t.Errorf("ConfigFromYaml failed to detect and autoconvert legacy yaml file with err %s", err) |
| } |
| |
| if !leg { |
| t.Errorf("ConfigFromYaml failed to report autoconversion of legacy yaml file") |
| } |
| |
| if c.Name != "fake/testing" { |
| t.Error("ConfigFromYaml failed to properly autoconvert legacy yaml file") |
| } |
| |
| // Two should survive the conversion |
| if len(c.Imports) != 2 { |
| t.Error("Expected two dep clauses to survive conversion, but got ", len(c.Imports)) |
| } |
| |
| found := false |
| found2 := false |
| for _, i := range c.Imports { |
| if i.Name == "github.com/Masterminds/convert" { |
| found = true |
| ref := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955" |
| if i.Version != ref { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version) |
| } |
| |
| repo := "git@github.com:Masterminds/convert.git" |
| if i.Repository != repo { |
| t.Errorf("(%s) Expected %q for repository, got %q", i.Name, repo, i.Repository) |
| } |
| } |
| |
| if i.Name == "github.com/Masterminds/structable" { |
| found2 = true |
| ref := "v1.0.0" |
| if i.Version != ref { |
| t.Errorf("(%s) Expected %q for constraint, got %q", i.Name, ref, i.Version) |
| } |
| } |
| } |
| |
| if !found { |
| t.Error("Unable to find github.com/Masterminds/convert") |
| } |
| if !found2 { |
| t.Error("Unable to find github.com/Masterminds/structable") |
| } |
| } |
| |
| func TestConfigFromYaml(t *testing.T) { |
| c, _, err := ConfigFromYaml([]byte(yml)) |
| if err != nil { |
| t.Error("ConfigFromYaml failed to parse yaml") |
| } |
| |
| if c.Name != "fake/testing" { |
| t.Error("ConfigFromYaml failed to properly parse yaml") |
| } |
| } |
| |
| func TestHasDependency(t *testing.T) { |
| c, _, err := ConfigFromYaml([]byte(yml)) |
| if err != nil { |
| t.Error("ConfigFromYaml failed to parse yaml for HasDependency") |
| } |
| |
| if !c.HasDependency("github.com/Masterminds/convert") { |
| t.Error("HasDependency failing to pickup depenency") |
| } |
| |
| if c.HasDependency("foo/bar/bar") != false { |
| t.Error("HasDependency picking up dependency it shouldn't") |
| } |
| } |
| |
| func TestOwners(t *testing.T) { |
| o := new(Owner) |
| o.Name = "foo" |
| o.Email = "foo@example.com" |
| o.Home = "https://foo.example.com" |
| |
| o2 := o.Clone() |
| if o2.Name != o.Name || o2.Email != o.Email || o2.Home != o.Home { |
| t.Error("Unable to clone Owner") |
| } |
| |
| o.Name = "Bar" |
| if o.Name == o2.Name { |
| t.Error("Owner clone is a pointer instead of a clone") |
| } |
| |
| s := make(Owners, 0, 1) |
| s = append(s, o) |
| s2 := s.Clone() |
| o3 := s2[0] |
| |
| o3.Name = "Qux" |
| |
| if o3.Name == o.Name { |
| t.Error("Owners cloning isn't deep") |
| } |
| |
| cfg := &Config{} |
| err := yaml.Unmarshal([]byte(yml), &cfg) |
| if err != nil { |
| t.Errorf("Unable to Unmarshal config yaml") |
| } |
| |
| if cfg.Owners[0].Name != "foo" || |
| cfg.Owners[0].Email != "bar@example.com" || |
| cfg.Owners[0].Home != "https://example.com" { |
| t.Error("Unable to parse owners from yaml") |
| } |
| } |
| |
| func TestDeduceConstraint(t *testing.T) { |
| // First, valid semver |
| c := DeduceConstraint("v1.0.0") |
| if c.(gps.Version).Type() != "semver" { |
| t.Errorf("Got unexpected version type when passing valid semver string: %T %s", c, c) |
| } |
| |
| // Now, 20 hex-encoded bytes (which should be assumed to be a SHA1 digest) |
| revin := "a9949121a2e2192ca92fa6dddfeaaa4a4412d955" |
| c = DeduceConstraint(revin) |
| if c != gps.Revision(revin) { |
| t.Errorf("Got unexpected version type/val when passing hex-encoded SHA1 digest: %T %s", c, c) |
| } |
| |
| // Now, the weird bzr guid |
| bzrguid := "john@smith.org-20051026185030-93c7cad63ee570df" |
| c = DeduceConstraint(bzrguid) |
| if c != gps.Revision(bzrguid) { |
| t.Errorf("Expected revision with valid bzr guid, got: %T %s", c, c) |
| } |
| |
| // Check fails if the bzr rev is malformed or weirdly formed |
| // |
| // chopping off a char should make the hex decode check fail |
| c = DeduceConstraint(bzrguid[:len(bzrguid)-1]) |
| if c != gps.NewVersion(bzrguid[:len(bzrguid)-1]) { |
| t.Errorf("Expected plain version when bzr guid has truncated tail hex bits: %T %s", c, c) |
| } |
| |
| // Extra dash in email doesn't mess us up |
| bzrguid2 := "john-smith@smith.org-20051026185030-93c7cad63ee570df" |
| c = DeduceConstraint(bzrguid2) |
| if c != gps.Revision(bzrguid2) { |
| t.Errorf("Expected revision when passing bzr guid has extra dash in email, got: %T %s", c, c) |
| } |
| |
| // Non-numeric char in middle section bites it |
| bzrguid3 := "john-smith@smith.org-2005102a6185030-93c7cad63ee570df" |
| c = DeduceConstraint(bzrguid3) |
| if c != gps.NewVersion(bzrguid3) { |
| t.Errorf("Expected plain version when bzr guid has invalid second section, got: %T %s", c, c) |
| } |
| } |