package discovery import ( "fmt" "strings" "testing" ) func TestPluginMetaSetManipulation(t *testing.T) { metas := []PluginMeta{ { Name: "foo", Version: "1.0.0", Path: "test-foo", }, { Name: "bar", Version: "2.0.0", Path: "test-bar", }, { Name: "baz", Version: "2.0.0", Path: "test-bar", }, } s := make(PluginMetaSet) if count := s.Count(); count != 0 { t.Fatalf("set has Count %d before any items added", count) } // Can we add metas? for _, p := range metas { s.Add(p) if !s.Has(p) { t.Fatalf("%q not in set after adding it", p.Name) } } if got, want := s.Count(), len(metas); got != want { t.Fatalf("set has Count %d after all items added; want %d", got, want) } // Can we still retrieve earlier ones after we added later ones? for _, p := range metas { if !s.Has(p) { t.Fatalf("%q not in set after all adds", p.Name) } } // Can we remove metas? for _, p := range metas { s.Remove(p) if s.Has(p) { t.Fatalf("%q still in set after removing it", p.Name) } } if count := s.Count(); count != 0 { t.Fatalf("set has Count %d after all items removed", count) } } func TestPluginMetaSetValidateVersions(t *testing.T) { metas := []PluginMeta{ { Name: "foo", Version: "1.0.0", Path: "test-foo", }, { Name: "bar", Version: "0.0.1", Path: "test-bar", }, { Name: "baz", Version: "bananas", Path: "test-bar", }, } s := make(PluginMetaSet) for _, p := range metas { s.Add(p) } valid, invalid := s.ValidateVersions() if count := valid.Count(); count != 2 { t.Errorf("valid set has %d metas; want 2", count) } if count := invalid.Count(); count != 1 { t.Errorf("valid set has %d metas; want 1", count) } if !valid.Has(metas[0]) { t.Errorf("'foo' not in valid set") } if !valid.Has(metas[1]) { t.Errorf("'bar' not in valid set") } if !invalid.Has(metas[2]) { t.Errorf("'baz' not in invalid set") } if invalid.Has(metas[0]) { t.Errorf("'foo' in invalid set") } if invalid.Has(metas[1]) { t.Errorf("'bar' in invalid set") } if valid.Has(metas[2]) { t.Errorf("'baz' in valid set") } } func TestPluginMetaSetWithName(t *testing.T) { tests := []struct { metas []PluginMeta name string wantCount int }{ { []PluginMeta{}, "foo", 0, }, { []PluginMeta{ { Name: "foo", Version: "0.0.1", Path: "foo", }, }, "foo", 1, }, { []PluginMeta{ { Name: "foo", Version: "0.0.1", Path: "foo", }, }, "bar", 0, }, } for i, test := range tests { t.Run(fmt.Sprintf("Test%02d", i), func(t *testing.T) { s := make(PluginMetaSet) for _, p := range test.metas { s.Add(p) } filtered := s.WithName(test.name) if gotCount := filtered.Count(); gotCount != test.wantCount { t.Errorf("got count %d in %#v; want %d", gotCount, filtered, test.wantCount) } }) } } func TestPluginMetaSetByName(t *testing.T) { metas := []PluginMeta{ { Name: "foo", Version: "1.0.0", Path: "test-foo", }, { Name: "foo", Version: "2.0.0", Path: "test-foo-2", }, { Name: "bar", Version: "0.0.1", Path: "test-bar", }, { Name: "baz", Version: "1.2.0", Path: "test-bar", }, } s := make(PluginMetaSet) for _, p := range metas { s.Add(p) } byName := s.ByName() if got, want := len(byName), 3; got != want { t.Errorf("%d keys in ByName map; want %d", got, want) } if got, want := len(byName["foo"]), 2; got != want { t.Errorf("%d metas for 'foo'; want %d", got, want) } if got, want := len(byName["bar"]), 1; got != want { t.Errorf("%d metas for 'bar'; want %d", got, want) } if got, want := len(byName["baz"]), 1; got != want { t.Errorf("%d metas for 'baz'; want %d", got, want) } if !byName["foo"].Has(metas[0]) { t.Errorf("%#v missing from 'foo' set", metas[0]) } if !byName["foo"].Has(metas[1]) { t.Errorf("%#v missing from 'foo' set", metas[1]) } if !byName["bar"].Has(metas[2]) { t.Errorf("%#v missing from 'bar' set", metas[2]) } if !byName["baz"].Has(metas[3]) { t.Errorf("%#v missing from 'baz' set", metas[3]) } } func TestPluginMetaSetNewest(t *testing.T) { tests := []struct { versions []string want string }{ { []string{ "0.0.1", }, "0.0.1", }, { []string{ "0.0.1", "0.0.2", }, "0.0.2", }, { []string{ "1.0.0", "1.0.0-beta1", }, "1.0.0", }, { []string{ "0.0.1", "1.0.0", }, "1.0.0", }, } for _, test := range tests { t.Run(strings.Join(test.versions, "|"), func(t *testing.T) { s := make(PluginMetaSet) for _, version := range test.versions { s.Add(PluginMeta{ Name: "foo", Version: VersionStr(version), Path: "foo-V" + version, }) } newest := s.Newest() if newest.Version != VersionStr(test.want) { t.Errorf("version is %q; want %q", newest.Version, test.want) } }) } } func TestPluginMetaSetConstrainVersions(t *testing.T) { metas := []PluginMeta{ { Name: "foo", Version: "1.0.0", Path: "test-foo", }, { Name: "foo", Version: "2.0.0", Path: "test-foo-2", }, { Name: "foo", Version: "3.0.0", Path: "test-foo-2", }, { Name: "bar", Version: "0.0.5", Path: "test-bar", }, { Name: "baz", Version: "0.0.1", Path: "test-bar", }, } s := make(PluginMetaSet) for _, p := range metas { s.Add(p) } byName := s.ConstrainVersions(PluginRequirements{ "foo": &PluginConstraints{Versions: ConstraintStr(">=2.0.0").MustParse()}, "bar": &PluginConstraints{Versions: ConstraintStr(">=0.0.0").MustParse()}, "baz": &PluginConstraints{Versions: ConstraintStr(">=1.0.0").MustParse()}, "fun": &PluginConstraints{Versions: ConstraintStr(">5.0.0").MustParse()}, }) if got, want := len(byName), 3; got != want { t.Errorf("%d keys in map; want %d", got, want) } if got, want := len(byName["foo"]), 2; got != want { t.Errorf("%d metas for 'foo'; want %d", got, want) } if got, want := len(byName["bar"]), 1; got != want { t.Errorf("%d metas for 'bar'; want %d", got, want) } if got, want := len(byName["baz"]), 0; got != want { t.Errorf("%d metas for 'baz'; want %d", got, want) } // "fun" is not in the map at all, because we have no metas for that name if !byName["foo"].Has(metas[1]) { t.Errorf("%#v missing from 'foo' set", metas[1]) } if !byName["foo"].Has(metas[2]) { t.Errorf("%#v missing from 'foo' set", metas[2]) } if !byName["bar"].Has(metas[3]) { t.Errorf("%#v missing from 'bar' set", metas[3]) } } func TestPluginMetaSetOverridePaths(t *testing.T) { metas := []PluginMeta{ { Name: "foo", Version: "1.0.0", Path: "test-foo-1", }, { Name: "foo", Version: "2.0.0", Path: "test-foo-2", }, { Name: "foo", Version: "3.0.0", Path: "test-foo-3", }, { Name: "bar", Version: "0.0.5", Path: "test-bar-5", }, { Name: "bar", Version: "0.0.6", Path: "test-bar-6", }, { Name: "baz", Version: "0.0.1", Path: "test-bar", }, } s := make(PluginMetaSet) for _, p := range metas { s.Add(p) } ns := s.OverridePaths(map[string]string{ "foo": "override-foo", "fun": "override-fun", }) if got, want := ns.Count(), 5; got != want { t.Errorf("got %d metas; want %d", got, want) } if !ns.Has(metas[3]) { t.Errorf("new set is missing %#v", metas[3]) } if !ns.Has(metas[4]) { t.Errorf("new set is missing %#v", metas[4]) } if !ns.Has(metas[5]) { t.Errorf("new set is missing %#v", metas[5]) } if !ns.Has(PluginMeta{ Name: "foo", Version: VersionZero, Path: "override-foo", }) { t.Errorf("new set is missing 'foo' override") } if !ns.Has(PluginMeta{ Name: "fun", Version: VersionZero, Path: "override-fun", }) { t.Errorf("new set is missing 'fun' override") } }