Skip to content

Commit c8d41dc

Browse files
committed
Add gomega ID matcher for gophercloud objects
1 parent 6e20028 commit c8d41dc

File tree

2 files changed

+62
-5
lines changed

2 files changed

+62
-5
lines changed

test/e2e/suites/e2e/e2e_suite_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,19 +86,19 @@ var _ = SynchronizedAfterSuite(func() {
8686
}, func() {
8787
endServers, err := shared.DumpOpenStackServers(e2eCtx, servers.ListOpts{})
8888
Expect(err).NotTo(HaveOccurred())
89-
Expect(endServers).To(Equal(initialServers))
89+
Expect(endServers).To(ConsistOfIDs(initialServers))
9090
endNetworks, err := shared.DumpOpenStackNetworks(e2eCtx, networks.ListOpts{})
9191
Expect(err).NotTo(HaveOccurred())
92-
Expect(endNetworks).To(Equal(initialNetworks))
92+
Expect(endNetworks).To(ConsistOfIDs(initialNetworks))
9393
endSecurityGroups, err := shared.DumpOpenStackSecurityGroups(e2eCtx, groups.ListOpts{})
9494
Expect(err).NotTo(HaveOccurred())
95-
Expect(endSecurityGroups).To(Equal(initialSecurityGroups))
95+
Expect(endSecurityGroups).To(ConsistOfIDs(initialSecurityGroups))
9696
endLoadBalancers, err := shared.DumpOpenStackLoadBalancers(e2eCtx, loadbalancers.ListOpts{})
9797
Expect(err).NotTo(HaveOccurred())
98-
Expect(endLoadBalancers).To(Equal(initialLoadBalancers))
98+
Expect(endLoadBalancers).To(ConsistOfIDs(initialLoadBalancers))
9999
endVolumes, err := shared.DumpOpenStackVolumes(e2eCtx, volumes.ListOpts{})
100100
Expect(err).NotTo(HaveOccurred())
101-
Expect(endVolumes).To(Equal(initialVolumes))
101+
Expect(endVolumes).To(ConsistOfIDs(initialVolumes))
102102

103103
shared.Node1AfterSuite(e2eCtx)
104104
})

test/e2e/suites/e2e/idmatcher_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package e2e
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
7+
"github.com/onsi/gomega"
8+
"github.com/onsi/gomega/format"
9+
"github.com/onsi/gomega/gstruct"
10+
"github.com/onsi/gomega/types"
11+
)
12+
13+
type idMatcher struct {
14+
expected interface{}
15+
}
16+
17+
var _ types.GomegaMatcher = &idMatcher{}
18+
var _ format.GomegaStringer = &idMatcher{}
19+
20+
func (m *idMatcher) Match(actual interface{}) (bool, error) {
21+
v := reflect.ValueOf(m.expected)
22+
id := v.FieldByName("ID").String()
23+
24+
matcher := &gstruct.FieldsMatcher{
25+
Fields: gstruct.Fields{
26+
"ID": gomega.Equal(id),
27+
},
28+
IgnoreExtras: true,
29+
}
30+
31+
return matcher.Match(actual)
32+
}
33+
34+
func (m *idMatcher) FailureMessage(actual interface{}) string {
35+
return fmt.Sprintf("Expected:\n%s\nto have the same ID as:\n%s", format.Object(actual, 1), format.Object(m.expected, 1))
36+
}
37+
38+
func (m *idMatcher) NegatedFailureMessage(actual interface{}) string {
39+
return fmt.Sprintf("Expected:\n%s\nnot to have the same ID as:\n%s", format.Object(actual, 1), format.Object(m.expected, 1))
40+
}
41+
42+
func (m *idMatcher) GomegaString() string {
43+
return fmt.Sprintf("ID match for:\n%s", format.Object(m.expected, 1))
44+
}
45+
46+
func IDOf(expected interface{}) types.GomegaMatcher {
47+
return &idMatcher{expected: expected}
48+
}
49+
50+
func ConsistOfIDs[T any](expected []T) types.GomegaMatcher {
51+
matchers := make([]types.GomegaMatcher, len(expected))
52+
for i := range expected {
53+
matchers[i] = IDOf(expected[i])
54+
}
55+
56+
return gomega.ConsistOf(matchers)
57+
}

0 commit comments

Comments
 (0)