1 package multipattern
2
3 import (
4 "fmt"
5 "testing"
6
7 "gotest.tools/v3/assert"
8 )
9
10 func TestParseBookMultiPatternResourceName(t *testing.T) {
11 goodPatterns := []string{
12 "shelves/shelf/books/book",
13 "publishers/publisher/books/book",
14 }
15 for _, pattern := range goodPatterns {
16 pattern := pattern
17 t.Run(pattern, func(t *testing.T) {
18 name, err := ParseBookMultiPatternResourceName(pattern)
19 assert.NilError(t, err)
20 assert.Equal(t, name.String(), pattern)
21 })
22 }
23
24 badPatterns := []string{
25 "books/book",
26 "others/other",
27 "others/other/books/book",
28 }
29 for _, pattern := range badPatterns {
30 pattern := pattern
31 t.Run(pattern, func(t *testing.T) {
32 _, err := ParseBookMultiPatternResourceName(pattern)
33 assert.Error(t, err, "no matching pattern")
34 })
35 }
36 }
37
38 func TestShelvesBookResourceName(t *testing.T) {
39 t.Run("good", func(t *testing.T) {
40 const (
41 shelf = "shelf"
42 book = "book"
43 )
44 pattern := fmt.Sprintf("shelves/%s/books/%s", shelf, book)
45 var name ShelvesBookResourceName
46 err := name.UnmarshalString(pattern)
47 assert.NilError(t, err)
48 assert.Equal(t, name.Shelf, shelf)
49 assert.Equal(t, name.Book, book)
50
51 marshalled, err := name.MarshalString()
52 assert.NilError(t, err)
53 assert.Equal(t, marshalled, pattern)
54 })
55
56 t.Run("bad top-level", func(t *testing.T) {
57 var name ShelvesBookResourceName
58 err := name.UnmarshalString("books/book")
59 assert.Error(
60 t,
61 err,
62 "parse resource name 'books/book' with pattern 'shelves/{shelf}/books/{book}': segment shelves: got books",
63 )
64 })
65
66 t.Run("bad wrong parent", func(t *testing.T) {
67 var name ShelvesBookResourceName
68 err := name.UnmarshalString("others/other/books/book")
69 assert.Error(
70 t,
71 err,
72 "parse resource name 'others/other/books/book' with pattern 'shelves/{shelf}/books/{book}': segment shelves: got others",
73 )
74 })
75 }
76
77 func TestPublishersBookResourceName(t *testing.T) {
78 t.Run("good", func(t *testing.T) {
79 const (
80 publisher = "publisher"
81 book = "book"
82 )
83 pattern := fmt.Sprintf("publishers/%s/books/%s", publisher, book)
84 var name PublishersBookResourceName
85 err := name.UnmarshalString(pattern)
86 assert.NilError(t, err)
87 assert.Equal(t, name.Publisher, publisher)
88 assert.Equal(t, name.Book, book)
89
90 marshalled, err := name.MarshalString()
91 assert.NilError(t, err)
92 assert.Equal(t, marshalled, pattern)
93 })
94
95 t.Run("bad top-level", func(t *testing.T) {
96 var name PublishersBookResourceName
97 err := name.UnmarshalString("books/book")
98 assert.Error(
99 t,
100 err,
101 "parse resource name 'books/book' with pattern 'publishers/{publisher}/books/{book}': segment publishers: got books",
102 )
103 })
104
105 t.Run("bad wrong parent", func(t *testing.T) {
106 var name PublishersBookResourceName
107 err := name.UnmarshalString("others/other/books/book")
108 assert.Error(
109 t,
110 err,
111 "parse resource name 'others/other/books/book' with pattern 'publishers/{publisher}/books/{book}': segment publishers: got others",
112 )
113 })
114 }
115
116 func TestParseShelfMultiPatternResourceName(t *testing.T) {
117 goodPatterns := []string{
118 "shelves/shelf",
119 "libraries/library/shelves/shelf",
120 "rooms/room/shelves/shelf",
121 }
122 for _, pattern := range goodPatterns {
123 pattern := pattern
124 t.Run(pattern, func(t *testing.T) {
125 name, err := ParseShelfMultiPatternResourceName(pattern)
126 assert.NilError(t, err)
127 assert.Equal(t, name.String(), pattern)
128 })
129 }
130
131 badPatterns := []string{
132 "others/other",
133 "others/other/shelves/shelf",
134 }
135 for _, pattern := range badPatterns {
136 pattern := pattern
137 t.Run(pattern, func(t *testing.T) {
138 _, err := ParseShelfMultiPatternResourceName(pattern)
139 assert.Error(t, err, "no matching pattern")
140 })
141 }
142 }
143
144 func TestShelfResourceName(t *testing.T) {
145 t.Run("good", func(t *testing.T) {
146 const shelf = "shelf"
147 pattern := fmt.Sprintf("shelves/%s", shelf)
148 var name ShelfResourceName
149 err := name.UnmarshalString(pattern)
150 assert.NilError(t, err)
151 assert.Equal(t, name.Shelf, shelf)
152
153 marshalled, err := name.MarshalString()
154 assert.NilError(t, err)
155 assert.Equal(t, marshalled, pattern)
156 })
157
158 t.Run("invalid", func(t *testing.T) {
159 var name ShelfResourceName
160 err := name.UnmarshalString("others/other")
161 assert.Error(t, err, "parse resource name 'others/other' with pattern 'shelves/{shelf}': segment shelves: got others")
162 })
163
164 t.Run("bad wrong parent", func(t *testing.T) {
165 var name ShelfResourceName
166 err := name.UnmarshalString("others/other/shelves/shelf")
167 assert.Error(
168 t,
169 err,
170 "parse resource name 'others/other/shelves/shelf' with pattern 'shelves/{shelf}': segment shelves: got others",
171 )
172 })
173 }
174
175 func TestLibrariesShelfResourceName(t *testing.T) {
176 t.Run("good", func(t *testing.T) {
177 const (
178 library = "library"
179 shelf = "shelf"
180 )
181 pattern := fmt.Sprintf("libraries/%s/shelves/%s", library, shelf)
182 var name LibrariesShelfResourceName
183 err := name.UnmarshalString(pattern)
184 assert.NilError(t, err)
185 assert.Equal(t, name.Library, library)
186 assert.Equal(t, name.Shelf, shelf)
187
188 marshalled, err := name.MarshalString()
189 assert.NilError(t, err)
190 assert.Equal(t, marshalled, pattern)
191 })
192
193 t.Run("bad top-level", func(t *testing.T) {
194 var name LibrariesShelfResourceName
195 err := name.UnmarshalString("books/book")
196 assert.Error(
197 t,
198 err,
199 "parse resource name 'books/book' with pattern 'libraries/{library}/shelves/{shelf}': segment libraries: got books",
200 )
201 })
202
203 t.Run("bad wrong parent", func(t *testing.T) {
204 var name LibrariesShelfResourceName
205 err := name.UnmarshalString("others/other/shelves/shelf")
206 assert.Error(
207 t,
208 err,
209 "parse resource name 'others/other/shelves/shelf' with pattern 'libraries/{library}/shelves/{shelf}': segment libraries: got others",
210 )
211 })
212 }
213
214 func TestRoomsShelfResourceName(t *testing.T) {
215 t.Run("good", func(t *testing.T) {
216 const (
217 room = "room"
218 shelf = "shelf"
219 )
220 pattern := fmt.Sprintf("rooms/%s/shelves/%s", room, shelf)
221 var name RoomsShelfResourceName
222 err := name.UnmarshalString(pattern)
223 assert.NilError(t, err)
224 assert.Equal(t, name.Room, room)
225 assert.Equal(t, name.Shelf, shelf)
226
227 marshalled, err := name.MarshalString()
228 assert.NilError(t, err)
229 assert.Equal(t, marshalled, pattern)
230 })
231
232 t.Run("bad top-level", func(t *testing.T) {
233 var name RoomsShelfResourceName
234 err := name.UnmarshalString("books/book")
235 assert.Error(
236 t,
237 err,
238 "parse resource name 'books/book' with pattern 'rooms/{room}/shelves/{shelf}': segment rooms: got books",
239 )
240 })
241
242 t.Run("bad wrong parent", func(t *testing.T) {
243 var name RoomsShelfResourceName
244 err := name.UnmarshalString("others/other/shelves/shelf")
245 assert.Error(
246 t,
247 err,
248 "parse resource name 'others/other/shelves/shelf' with pattern 'rooms/{room}/shelves/{shelf}': segment rooms: got others",
249 )
250 })
251 }
252
View as plain text