Skip to content

Commit

Permalink
test: add member tests for v4 APIs
Browse files Browse the repository at this point in the history
GKO-719
  • Loading branch information
ctschacher committed Nov 8, 2024
1 parent 01d333c commit 9796ea2
Show file tree
Hide file tree
Showing 6 changed files with 278 additions and 5 deletions.
4 changes: 2 additions & 2 deletions api/model/api/base/member.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ type Member struct {

func (m *Member) String() string {
return fmt.Sprintf(
"{Source:%s,SourceID:%s,DisplayName:%s,Role:%s}",
m.Source, m.SourceID, *m.DisplayName, m.Role,
"{Source:%s,SourceID:%s,Role:%s}",
m.Source, m.SourceID, m.Role,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ var _ = Describe("Update", labels.WithContext, func() {

fixtures = fixtures.Apply()

By("checking that exported API has two members")
By("checking that exported API has a member")

Eventually(func() error {
export, err := apim.Export.V2Api(fixtures.API.Status.ID)
Expand All @@ -85,7 +85,7 @@ var _ = Describe("Update", labels.WithContext, func() {
return manager.UpdateSafely(ctx, fixtures.API)
}, timeout, interval).Should(Succeed(), fixtures.API.Name)

By("checking that exported API has one member left")
By("checking that exported API has no members anymore")

Eventually(func() error {
export, err := apim.Export.V2Api(fixtures.API.Status.ID)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright (C) 2015 The Gravitee team (http://gravitee.io)
//
// 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 v4

import (
"context"

"github.com/gravitee-io/gravitee-kubernetes-operator/api/model/api/base"
"github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/model"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/apim"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/assert"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/constants"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/fixture"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/labels"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/random"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/sort"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

var _ = Describe("Create", labels.WithContext, func() {
timeout := constants.EventualTimeout
interval := constants.Interval

ctx := context.Background()

It("should change the role of an API member", func() {
fixtures := fixture.
Builder().
WithAPIv4(constants.ApiV4).
WithContext(constants.ContextWithCredentialsFile).
Build()

By("initializing a service account in current organization")
apim := apim.NewClient(ctx)
saName := random.GetName()
Expect(apim.Org.CreateUser(model.NewServiceAccount(saName))).To(Succeed())

By("applying the API with created service account as members")
saMemberWithoutRole := base.NewGraviteeMember(saName, "")
fixtures.APIv4.Spec.Members = []*base.Member{saMemberWithoutRole}
fixtures = fixtures.Apply()

By("setting up expected members")
expectedMemberWithDefaultRole := base.NewGraviteeMember(saName, "USER")
expectedMembers := []*base.Member{expectedMemberWithDefaultRole}

By("checking that member without role has default role assigned in exported API")

Eventually(func() error {
apiExport, err := apim.Export.V4Api(fixtures.APIv4.Status.ID)
if err != nil {
return err
}

exportedMembers := apiExport.Spec.Members

return assert.SliceEqualsSorted(
"members",
expectedMembers, exportedMembers,
sort.MembersComparator,
)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// Copyright (C) 2015 The Gravitee team (http://gravitee.io)
//
// 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 v4

import (
"context"

"github.com/gravitee-io/gravitee-kubernetes-operator/api/model/api/base"
"github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/model"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/apim"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/assert"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/constants"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/fixture"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/labels"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/manager"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/random"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/sort"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

var _ = Describe("Update", labels.WithContext, func() {
timeout := constants.EventualTimeout
interval := constants.Interval

ctx := context.Background()

It("should change the role of an API member", func() {
fixtures := fixture.
Builder().
WithAPIv4(constants.ApiV4).
WithContext(constants.ContextWithCredentialsFile).
Build()

By("initializing a service account in current organization")
apim := apim.NewClient(ctx)
saName := random.GetName()
Expect(apim.Org.CreateUser(model.NewServiceAccount(saName))).To(Succeed())

By("applying the API with created service account as members")
saMember := base.NewGraviteeMember(saName, "REVIEWER")
fixtures.APIv4.Spec.Members = []*base.Member{saMember}
fixtures = fixtures.Apply()

By("checking that exported API has two members")
Eventually(func() error {
export, err := apim.Export.V4Api(fixtures.APIv4.Status.ID)
if err != nil {
return err
}
return assert.SliceEqualsSorted(
"members",
[]*base.Member{saMember},
export.Spec.Members,
sort.MembersComparator,
)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)

By("changing role of API member from REVIEWER to USER")
saMember.Role = "USER"
expectedMembers := []*base.Member{saMember}
fixtures.APIv4.Spec.Members = expectedMembers

Eventually(func() error {
return manager.UpdateSafely(ctx, fixtures.APIv4)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)

By("checking that exported API has one member left")

Eventually(func() error {
export, err := apim.Export.V4Api(fixtures.APIv4.Status.ID)
if err != nil {
return err
}
return assert.SliceEqualsSorted(
"members",
expectedMembers, export.Spec.Members,
sort.MembersComparator,
)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Copyright (C) 2015 The Gravitee team (http://gravitee.io)
//
// 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 v4

import (
"context"

"github.com/gravitee-io/gravitee-kubernetes-operator/api/model/api/base"
"github.com/gravitee-io/gravitee-kubernetes-operator/internal/apim/model"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/apim"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/assert"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/constants"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/fixture"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/labels"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/manager"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/random"
"github.com/gravitee-io/gravitee-kubernetes-operator/test/internal/integration/sort"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
)

var _ = Describe("Update", labels.WithContext, func() {
timeout := constants.EventualTimeout
interval := constants.Interval

ctx := context.Background()

It("should remove an API member", func() {
fixtures := fixture.
Builder().
WithAPIv4(constants.ApiV4).
WithContext(constants.ContextWithCredentialsFile).
Build()

By("initializing a service account in current organization")
apim := apim.NewClient(ctx)
saName := random.GetName()
Expect(apim.Org.CreateUser(model.NewServiceAccount(saName))).To(Succeed())

By("applying the API with created service account as members")
saMember := base.NewGraviteeMember(saName, "REVIEWER")
expectedMembers := []*base.Member{}
fixtures.APIv4.Spec.Members = []*base.Member{saMember}
fixtures = fixtures.Apply()

By("checking that exported API has a member")
Eventually(func() error {
export, err := apim.Export.V4Api(fixtures.APIv4.Status.ID)
if err != nil {
return err
}
return assert.SliceEqualsSorted(
"members",
[]*base.Member{saMember}, export.Spec.Members,
sort.MembersComparator,
)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)

By("removing service account from API members")
fixtures.APIv4.Spec.Members = expectedMembers
Eventually(func() error {
return manager.UpdateSafely(ctx, fixtures.APIv4)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)

By("checking that exported API has no members anymore")
Eventually(func() error {
export, err := apim.Export.V4Api(fixtures.APIv4.Status.ID)
if err != nil {
return err
}
return assert.SliceEqualsSorted("members", nil, export.Spec.Members, sort.MembersComparator)
}, timeout, interval).Should(Succeed(), fixtures.APIv4.Name)
})
})
15 changes: 14 additions & 1 deletion test/internal/integration/assert/assert.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,20 @@ func SliceEqualsSorted[S ~[]E, E any](field string, expected S, given S, comp so
slices.SortFunc(ecp, comp)
copy(gcp, given)
slices.SortFunc(gcp, comp)
return Equals(field, ecp, gcp)
return Equals(field, callStringerIfExists(ecp), callStringerIfExists(gcp))
}

func callStringerIfExists[E any](stringersOrNot []E) []any {
stringified := make([]any, len(stringersOrNot))
for i := range stringersOrNot {
stringerOrNot := stringersOrNot[i]
if stringer, ok := any(stringerOrNot).(fmt.Stringer); ok {
stringified[i] = stringer.String()
} else {
stringified[i] = stringerOrNot
}
}
return stringified
}

func NotEmptySlice[T any](field string, value []T) error {
Expand Down

0 comments on commit 9796ea2

Please sign in to comment.