package testing import ( "strings" "testing" "devel.mephi.ru/iacherepanov/openstack-gophercloud" "devel.mephi.ru/iacherepanov/openstack-gophercloud/openstack" tokens2 "devel.mephi.ru/iacherepanov/openstack-gophercloud/openstack/identity/v2/tokens" tokens3 "devel.mephi.ru/iacherepanov/openstack-gophercloud/openstack/identity/v3/tokens" th "devel.mephi.ru/iacherepanov/openstack-gophercloud/testhelper" ) // Service catalog fixtures take too much vertical space! var catalog2 = tokens2.ServiceCatalog{ Entries: []tokens2.CatalogEntry{ tokens2.CatalogEntry{ Type: "same", Name: "same", Endpoints: []tokens2.Endpoint{ tokens2.Endpoint{ Region: "same", PublicURL: "https://public.correct.com/", InternalURL: "https://internal.correct.com/", AdminURL: "https://admin.correct.com/", }, tokens2.Endpoint{ Region: "different", PublicURL: "https://badregion.com/", }, }, }, tokens2.CatalogEntry{ Type: "same", Name: "different", Endpoints: []tokens2.Endpoint{ tokens2.Endpoint{ Region: "same", PublicURL: "https://badname.com/", }, tokens2.Endpoint{ Region: "different", PublicURL: "https://badname.com/+badregion", }, }, }, tokens2.CatalogEntry{ Type: "different", Name: "different", Endpoints: []tokens2.Endpoint{ tokens2.Endpoint{ Region: "same", PublicURL: "https://badtype.com/+badname", }, tokens2.Endpoint{ Region: "different", PublicURL: "https://badtype.com/+badregion+badname", }, }, }, }, } func TestV2EndpointExact(t *testing.T) { expectedURLs := map[gophercloud.Availability]string{ gophercloud.AvailabilityPublic: "https://public.correct.com/", gophercloud.AvailabilityAdmin: "https://admin.correct.com/", gophercloud.AvailabilityInternal: "https://internal.correct.com/", } for availability, expected := range expectedURLs { actual, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ Type: "same", Name: "same", Region: "same", Availability: availability, }) th.AssertNoErr(t, err) th.CheckEquals(t, expected, actual) } } func TestV2EndpointNone(t *testing.T) { _, actual := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ Type: "nope", Availability: gophercloud.AvailabilityPublic, }) expected := &gophercloud.ErrEndpointNotFound{} th.CheckEquals(t, expected.Error(), actual.Error()) } func TestV2EndpointMultiple(t *testing.T) { _, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ Type: "same", Region: "same", Availability: gophercloud.AvailabilityPublic, }) if !strings.HasPrefix(err.Error(), "Discovered 2 matching endpoints:") { t.Errorf("Received unexpected error: %v", err) } } func TestV2EndpointBadAvailability(t *testing.T) { _, err := openstack.V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ Type: "same", Name: "same", Region: "same", Availability: "wat", }) th.CheckEquals(t, "Unexpected availability in endpoint query: wat", err.Error()) } var catalog3 = tokens3.ServiceCatalog{ Entries: []tokens3.CatalogEntry{ tokens3.CatalogEntry{ Type: "same", Name: "same", Endpoints: []tokens3.Endpoint{ tokens3.Endpoint{ ID: "1", Region: "same", Interface: "public", URL: "https://public.correct.com/", }, tokens3.Endpoint{ ID: "2", Region: "same", Interface: "admin", URL: "https://admin.correct.com/", }, tokens3.Endpoint{ ID: "3", Region: "same", Interface: "internal", URL: "https://internal.correct.com/", }, tokens3.Endpoint{ ID: "4", Region: "different", Interface: "public", URL: "https://badregion.com/", }, }, }, tokens3.CatalogEntry{ Type: "same", Name: "different", Endpoints: []tokens3.Endpoint{ tokens3.Endpoint{ ID: "5", Region: "same", Interface: "public", URL: "https://badname.com/", }, tokens3.Endpoint{ ID: "6", Region: "different", Interface: "public", URL: "https://badname.com/+badregion", }, }, }, tokens3.CatalogEntry{ Type: "different", Name: "different", Endpoints: []tokens3.Endpoint{ tokens3.Endpoint{ ID: "7", Region: "same", Interface: "public", URL: "https://badtype.com/+badname", }, tokens3.Endpoint{ ID: "8", Region: "different", Interface: "public", URL: "https://badtype.com/+badregion+badname", }, }, }, tokens3.CatalogEntry{ Type: "someother", Name: "someother", Endpoints: []tokens3.Endpoint{ tokens3.Endpoint{ ID: "1", Region: "someother", Interface: "public", URL: "https://public.correct.com/", }, tokens3.Endpoint{ ID: "2", RegionID: "someother", Interface: "admin", URL: "https://admin.correct.com/", }, tokens3.Endpoint{ ID: "3", RegionID: "someother", Interface: "internal", URL: "https://internal.correct.com/", }, }, }, }, } func TestV3EndpointExact(t *testing.T) { expectedURLs := map[gophercloud.Availability]string{ gophercloud.AvailabilityPublic: "https://public.correct.com/", gophercloud.AvailabilityAdmin: "https://admin.correct.com/", gophercloud.AvailabilityInternal: "https://internal.correct.com/", } for availability, expected := range expectedURLs { actual, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{ Type: "same", Name: "same", Region: "same", Availability: availability, }) th.AssertNoErr(t, err) th.CheckEquals(t, expected, actual) } } func TestV3EndpointNone(t *testing.T) { _, actual := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{ Type: "nope", Availability: gophercloud.AvailabilityPublic, }) expected := &gophercloud.ErrEndpointNotFound{} th.CheckEquals(t, expected.Error(), actual.Error()) } func TestV3EndpointMultiple(t *testing.T) { _, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{ Type: "same", Region: "same", Availability: gophercloud.AvailabilityPublic, }) if !strings.HasPrefix(err.Error(), "Discovered 2 matching endpoints:") { t.Errorf("Received unexpected error: %v", err) } } func TestV3EndpointBadAvailability(t *testing.T) { _, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{ Type: "same", Name: "same", Region: "same", Availability: "wat", }) th.CheckEquals(t, "Unexpected availability in endpoint query: wat", err.Error()) } func TestV3EndpointWithRegionID(t *testing.T) { expectedURLs := map[gophercloud.Availability]string{ gophercloud.AvailabilityPublic: "https://public.correct.com/", gophercloud.AvailabilityAdmin: "https://admin.correct.com/", gophercloud.AvailabilityInternal: "https://internal.correct.com/", } for availability, expected := range expectedURLs { actual, err := openstack.V3EndpointURL(&catalog3, gophercloud.EndpointOpts{ Type: "someother", Name: "someother", Region: "someother", Availability: availability, }) th.AssertNoErr(t, err) th.CheckEquals(t, expected, actual) } }