@paakd/api 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/buf/validate/validate_pb.ts +5001 -0
  2. package/dist/gen/buf/validate/validate_pb.d.ts +4634 -0
  3. package/dist/gen/buf/validate/validate_pb.d.ts.map +1 -0
  4. package/dist/gen/buf/validate/validate_pb.js +414 -0
  5. package/dist/gen/src/proto/auth/v1/entities/auth_pb.d.ts +268 -0
  6. package/dist/gen/src/proto/auth/v1/entities/auth_pb.d.ts.map +1 -0
  7. package/dist/gen/src/proto/auth/v1/entities/auth_pb.js +120 -0
  8. package/dist/gen/src/proto/auth/v1/entities/policy_pb.d.ts +235 -0
  9. package/dist/gen/src/proto/auth/v1/entities/policy_pb.d.ts.map +1 -0
  10. package/dist/gen/src/proto/auth/v1/entities/policy_pb.js +98 -0
  11. package/dist/gen/src/proto/auth/v1/service_pb.d.ts +117 -0
  12. package/dist/gen/src/proto/auth/v1/service_pb.d.ts.map +1 -0
  13. package/dist/gen/src/proto/auth/v1/service_pb.js +22 -0
  14. package/dist/gen/src/proto/customers/v1/entities/address_pb.d.ts +371 -0
  15. package/dist/gen/src/proto/customers/v1/entities/address_pb.d.ts.map +1 -0
  16. package/dist/gen/src/proto/customers/v1/entities/address_pb.js +84 -0
  17. package/dist/gen/src/proto/customers/v1/entities/profile_pb.d.ts +189 -0
  18. package/dist/gen/src/proto/customers/v1/entities/profile_pb.d.ts.map +1 -0
  19. package/dist/gen/src/proto/customers/v1/entities/profile_pb.js +70 -0
  20. package/dist/gen/src/proto/customers/v1/service_pb.d.ts +85 -0
  21. package/dist/gen/src/proto/customers/v1/service_pb.d.ts.map +1 -0
  22. package/dist/gen/src/proto/customers/v1/service_pb.js +22 -0
  23. package/dist/gen/src/proto/products/v1/entities/category_pb.d.ts +234 -0
  24. package/dist/gen/src/proto/products/v1/entities/category_pb.d.ts.map +1 -0
  25. package/dist/gen/src/proto/products/v1/entities/category_pb.js +84 -0
  26. package/dist/gen/src/proto/products/v1/entities/collection_pb.d.ts +159 -0
  27. package/dist/gen/src/proto/products/v1/entities/collection_pb.d.ts.map +1 -0
  28. package/dist/gen/src/proto/products/v1/entities/collection_pb.js +70 -0
  29. package/dist/gen/src/proto/products/v1/entities/product/create_pb.d.ts +146 -0
  30. package/dist/gen/src/proto/products/v1/entities/product/create_pb.d.ts.map +1 -0
  31. package/dist/gen/src/proto/products/v1/entities/product/create_pb.js +32 -0
  32. package/dist/gen/src/proto/products/v1/entities/product/option_pb.d.ts +50 -0
  33. package/dist/gen/src/proto/products/v1/entities/product/option_pb.d.ts.map +1 -0
  34. package/dist/gen/src/proto/products/v1/entities/product/option_pb.js +32 -0
  35. package/dist/gen/src/proto/products/v1/entities/product/shared_pb.d.ts +1042 -0
  36. package/dist/gen/src/proto/products/v1/entities/product/shared_pb.d.ts.map +1 -0
  37. package/dist/gen/src/proto/products/v1/entities/product/shared_pb.js +258 -0
  38. package/dist/gen/src/proto/products/v1/entities/product/update_pb.d.ts +236 -0
  39. package/dist/gen/src/proto/products/v1/entities/product/update_pb.d.ts.map +1 -0
  40. package/dist/gen/src/proto/products/v1/entities/product/update_pb.js +88 -0
  41. package/dist/gen/src/proto/products/v1/entities/tag_pb.d.ts +175 -0
  42. package/dist/gen/src/proto/products/v1/entities/tag_pb.d.ts.map +1 -0
  43. package/dist/gen/src/proto/products/v1/entities/tag_pb.js +84 -0
  44. package/dist/gen/src/proto/products/v1/entities/taxonomy_pb.d.ts +477 -0
  45. package/dist/gen/src/proto/products/v1/entities/taxonomy_pb.d.ts.map +1 -0
  46. package/dist/gen/src/proto/products/v1/entities/taxonomy_pb.js +235 -0
  47. package/dist/gen/src/proto/products/v1/entities/type_pb.d.ts +158 -0
  48. package/dist/gen/src/proto/products/v1/entities/type_pb.d.ts.map +1 -0
  49. package/dist/gen/src/proto/products/v1/entities/type_pb.js +70 -0
  50. package/dist/gen/src/proto/products/v1/entities/variant_pb.d.ts +489 -0
  51. package/dist/gen/src/proto/products/v1/entities/variant_pb.d.ts.map +1 -0
  52. package/dist/gen/src/proto/products/v1/entities/variant_pb.js +147 -0
  53. package/dist/gen/src/proto/products/v1/service_pb.d.ts +316 -0
  54. package/dist/gen/src/proto/products/v1/service_pb.d.ts.map +1 -0
  55. package/dist/gen/src/proto/products/v1/service_pb.js +36 -0
  56. package/dist/src/address.d.ts +53 -0
  57. package/dist/src/address.d.ts.map +1 -0
  58. package/dist/src/address.js +233 -0
  59. package/dist/src/address.spec.d.ts +2 -0
  60. package/dist/src/address.spec.d.ts.map +1 -0
  61. package/dist/src/address.spec.js +488 -0
  62. package/dist/src/auth.d.ts +27 -0
  63. package/dist/src/auth.d.ts.map +1 -0
  64. package/dist/src/auth.js +155 -0
  65. package/dist/src/auth.spec.d.ts +2 -0
  66. package/dist/src/auth.spec.d.ts.map +1 -0
  67. package/dist/src/auth.spec.js +582 -0
  68. package/dist/src/compressor/brotli.d.ts +3 -0
  69. package/dist/src/compressor/brotli.d.ts.map +1 -0
  70. package/dist/src/compressor/brotli.js +30 -0
  71. package/dist/src/index.d.ts +6 -0
  72. package/dist/src/index.d.ts.map +1 -0
  73. package/dist/src/interceptors.d.ts +16 -0
  74. package/dist/src/interceptors.d.ts.map +1 -0
  75. package/dist/src/interceptors.js +156 -0
  76. package/dist/src/interceptors.spec.d.ts +2 -0
  77. package/dist/src/interceptors.spec.d.ts.map +1 -0
  78. package/dist/src/interceptors.spec.js +1063 -0
  79. package/dist/src/policies.d.ts +217 -0
  80. package/dist/src/policies.d.ts.map +1 -0
  81. package/dist/src/policies.js +322 -0
  82. package/dist/src/policies.spec.d.ts +2 -0
  83. package/dist/src/policies.spec.d.ts.map +1 -0
  84. package/dist/src/policies.spec.js +463 -0
  85. package/dist/src/products.d.ts +39 -0
  86. package/dist/src/products.d.ts.map +1 -0
  87. package/dist/src/products.js +95 -0
  88. package/dist/src/products.spec.d.ts +2 -0
  89. package/dist/src/products.spec.d.ts.map +1 -0
  90. package/dist/src/products.spec.js +519 -0
  91. package/dist/src/profile.d.ts +62 -0
  92. package/dist/src/profile.d.ts.map +1 -0
  93. package/dist/src/profile.js +151 -0
  94. package/dist/src/profile.spec.d.ts +2 -0
  95. package/dist/src/profile.spec.d.ts.map +1 -0
  96. package/dist/src/profile.spec.js +475 -0
  97. package/dist/src/registration.d.ts +60 -0
  98. package/dist/src/registration.d.ts.map +1 -0
  99. package/dist/src/registration.js +147 -0
  100. package/dist/src/test-utils.d.ts +87 -0
  101. package/dist/src/test-utils.d.ts.map +1 -0
  102. package/dist/src/test-utils.js +132 -0
  103. package/gen/buf/validate/validate_pb.ts +4799 -0
  104. package/gen/src/proto/auth/v1/authv1connect/service.connect.go +454 -0
  105. package/gen/src/proto/auth/v1/entities/auth.pb.go +818 -0
  106. package/gen/src/proto/auth/v1/entities/auth_pb.ts +348 -0
  107. package/gen/src/proto/auth/v1/entities/policy.pb.go +727 -0
  108. package/gen/src/proto/auth/v1/entities/policy_pb.ts +306 -0
  109. package/gen/src/proto/auth/v1/service-AuthService_connectquery.ts +70 -0
  110. package/gen/src/proto/auth/v1/service.pb.go +119 -0
  111. package/gen/src/proto/auth/v1/service_pb.ts +152 -0
  112. package/gen/src/proto/customers/v1/customersv1connect/service.connect.go +358 -0
  113. package/gen/src/proto/customers/v1/entities/address.pb.go +1073 -0
  114. package/gen/src/proto/customers/v1/entities/address_pb.ts +478 -0
  115. package/gen/src/proto/customers/v1/entities/profile.pb.go +633 -0
  116. package/gen/src/proto/customers/v1/entities/profile_pb.ts +252 -0
  117. package/gen/src/proto/customers/v1/service-CustomerService_connectquery.ts +50 -0
  118. package/gen/src/proto/customers/v1/service.pb.go +110 -0
  119. package/gen/src/proto/customers/v1/service_pb.ts +121 -0
  120. package/gen/src/proto/files/v1/entities/file.pb.go +669 -0
  121. package/gen/src/proto/files/v1/entities/file_pb.ts +265 -0
  122. package/gen/src/proto/files/v1/filesv1connect/service.connect.go +200 -0
  123. package/gen/src/proto/files/v1/service-FileService_connectquery.ts +25 -0
  124. package/gen/src/proto/files/v1/service.pb.go +85 -0
  125. package/gen/src/proto/files/v1/service_pb.ts +65 -0
  126. package/gen/src/proto/products/v1/entities/category.pb.go +744 -0
  127. package/gen/src/proto/products/v1/entities/category_pb.ts +318 -0
  128. package/gen/src/proto/products/v1/entities/collection.pb.go +528 -0
  129. package/gen/src/proto/products/v1/entities/collection_pb.ts +214 -0
  130. package/gen/src/proto/products/v1/entities/product/create.pb.go +453 -0
  131. package/gen/src/proto/products/v1/entities/product/create_pb.ts +199 -0
  132. package/gen/src/proto/products/v1/entities/product/option.pb.go +206 -0
  133. package/gen/src/proto/products/v1/entities/product/option_pb.ts +74 -0
  134. package/gen/src/proto/products/v1/entities/product/shared.pb.go +2890 -0
  135. package/gen/src/proto/products/v1/entities/product/shared_pb.ts +1317 -0
  136. package/gen/src/proto/products/v1/entities/product/update.pb.go +794 -0
  137. package/gen/src/proto/products/v1/entities/product/update_pb.ts +325 -0
  138. package/gen/src/proto/products/v1/entities/tag.pb.go +610 -0
  139. package/gen/src/proto/products/v1/entities/tag_pb.ts +233 -0
  140. package/gen/src/proto/products/v1/entities/taxonomy.pb.go +1352 -0
  141. package/gen/src/proto/products/v1/entities/taxonomy_pb.ts +606 -0
  142. package/gen/src/proto/products/v1/entities/type.pb.go +553 -0
  143. package/gen/src/proto/products/v1/entities/type_pb.ts +215 -0
  144. package/gen/src/proto/products/v1/entities/variant.pb.go +1474 -0
  145. package/gen/src/proto/products/v1/entities/variant_pb.ts +629 -0
  146. package/gen/src/proto/products/v1/productsv1connect/service.connect.go +1195 -0
  147. package/gen/src/proto/products/v1/service-ProductsService_connectquery.ts +199 -0
  148. package/gen/src/proto/products/v1/service.pb.go +250 -0
  149. package/gen/src/proto/products/v1/service_pb.ts +429 -0
  150. package/gen/src/proto/promotions/v1/entities/campaign.pb.go +1229 -0
  151. package/gen/src/proto/promotions/v1/entities/campaign_pb.ts +511 -0
  152. package/gen/src/proto/promotions/v1/promotionsv1connect/service.connect.go +289 -0
  153. package/gen/src/proto/promotions/v1/service-CampaignService_connectquery.ts +42 -0
  154. package/gen/src/proto/promotions/v1/service.pb.go +98 -0
  155. package/gen/src/proto/promotions/v1/service_pb.ts +95 -0
  156. package/gen/src/proto/stocknodes/v1/entities/stocknode.pb.go +1499 -0
  157. package/gen/src/proto/stocknodes/v1/entities/stocknode_pb.ts +655 -0
  158. package/gen/src/proto/stocknodes/v1/service-StockNodesService_connectquery.ts +41 -0
  159. package/gen/src/proto/stocknodes/v1/service.pb.go +98 -0
  160. package/gen/src/proto/stocknodes/v1/service_pb.ts +95 -0
  161. package/gen/src/proto/stocknodes/v1/stocknodesv1connect/service.connect.go +297 -0
  162. package/package.json +5 -2
  163. package/src/address.spec.ts +0 -662
  164. package/src/address.ts +0 -300
  165. package/src/auth.spec.ts +0 -771
  166. package/src/auth.ts +0 -168
  167. package/src/compressor/brotli.ts +0 -26
  168. package/src/index.ts +0 -5
  169. package/src/interceptors.spec.ts +0 -1343
  170. package/src/interceptors.ts +0 -224
  171. package/src/policies.spec.ts +0 -595
  172. package/src/policies.ts +0 -431
  173. package/src/products.spec.ts +0 -710
  174. package/src/products.ts +0 -112
  175. package/src/profile.spec.ts +0 -626
  176. package/src/profile.ts +0 -169
  177. package/src/proto/auth/v1/entities/auth.proto +0 -140
  178. package/src/proto/auth/v1/entities/policy.proto +0 -57
  179. package/src/proto/auth/v1/service.proto +0 -26
  180. package/src/proto/customers/v1/entities/address.proto +0 -101
  181. package/src/proto/customers/v1/entities/profile.proto +0 -118
  182. package/src/proto/customers/v1/service.proto +0 -36
  183. package/src/proto/files/v1/entities/file.proto +0 -62
  184. package/src/proto/files/v1/service.proto +0 -19
  185. package/src/proto/products/v1/entities/category.proto +0 -98
  186. package/src/proto/products/v1/entities/collection.proto +0 -72
  187. package/src/proto/products/v1/entities/product/create.proto +0 -41
  188. package/src/proto/products/v1/entities/product/option.proto +0 -17
  189. package/src/proto/products/v1/entities/product/shared.proto +0 -255
  190. package/src/proto/products/v1/entities/product/update.proto +0 -66
  191. package/src/proto/products/v1/entities/tag.proto +0 -73
  192. package/src/proto/products/v1/entities/taxonomy.proto +0 -146
  193. package/src/proto/products/v1/entities/type.proto +0 -98
  194. package/src/proto/products/v1/entities/variant.proto +0 -127
  195. package/src/proto/products/v1/service.proto +0 -78
  196. package/src/proto/promotions/v1/entities/campaign.proto +0 -145
  197. package/src/proto/promotions/v1/service.proto +0 -17
  198. package/src/proto/stocknodes/v1/entities/stocknode.proto +0 -167
  199. package/src/proto/stocknodes/v1/service.proto +0 -21
  200. package/src/registration.ts +0 -170
  201. package/src/test-utils.ts +0 -176
@@ -1,595 +0,0 @@
1
- import { Code, ConnectError, createClient } from '@connectrpc/connect'
2
- import { createGrpcTransport } from '@connectrpc/connect-node'
3
- import { getCheckoutConfig } from '@paakd/config'
4
- import {
5
- createAuthenticationInterceptor,
6
- createHeadersInterceptor,
7
- } from './interceptors'
8
- import {
9
- addPolicies,
10
- addPolicy,
11
- getFilteredPolicy,
12
- getPolicies,
13
- removeFilteredPolicy,
14
- removePolicies,
15
- removePolicy,
16
- savePolicies,
17
- } from './policies'
18
-
19
- // Mock dependencies
20
- vi.mock('@connectrpc/connect', async () => {
21
- const actual = await vi.importActual('@connectrpc/connect')
22
- return {
23
- ...actual,
24
- createClient: vi.fn(),
25
- }
26
- })
27
-
28
- vi.mock('./compressor/brotli', () => ({
29
- brotliCompression: {
30
- name: 'brotli',
31
- compress: vi.fn(),
32
- decompress: vi.fn(),
33
- },
34
- }))
35
-
36
- vi.mock('@connectrpc/connect-node', () => ({
37
- createGrpcTransport: vi.fn(),
38
- }))
39
-
40
- vi.mock('@paakd/config', () => ({
41
- getCheckoutConfig: vi.fn(),
42
- }))
43
-
44
- vi.mock('./interceptors', () => ({
45
- createAuthenticationInterceptor: vi.fn(),
46
- createHeadersInterceptor: vi.fn().mockReturnValue(() => {}),
47
- }))
48
-
49
- vi.mock('../gen/src/proto/auth/v1/service_pb', () => ({
50
- AuthService: {},
51
- }))
52
-
53
- const mockGetCheckoutConfig = vi.mocked(getCheckoutConfig)
54
- const mockCreateGrpcTransport = vi.mocked(createGrpcTransport)
55
- const mockCreateClient = vi.mocked(createClient)
56
- const mockCreateAuthenticationInterceptor = vi.mocked(
57
- createAuthenticationInterceptor
58
- )
59
- const mockCreateHeadersInterceptor = vi.mocked(createHeadersInterceptor)
60
-
61
- describe('policies', () => {
62
- let mockAuthClient: any
63
- let mockTransport: any
64
- let mockCheckoutConfig: any
65
- let mockInterceptor: any
66
-
67
- beforeEach(() => {
68
- // Reset all mocks
69
- vi.clearAllMocks()
70
-
71
- // Setup mock objects
72
- mockAuthClient = {
73
- getPolicies: vi.fn(),
74
- savePolicies: vi.fn(),
75
- addPolicy: vi.fn(),
76
- addPolicies: vi.fn(),
77
- removePolicy: vi.fn(),
78
- removePolicies: vi.fn(),
79
- removeFilteredPolicy: vi.fn(),
80
- getFilteredPolicy: vi.fn(),
81
- }
82
-
83
- mockTransport = {}
84
- mockCheckoutConfig = {
85
- enterpriseURL: 'https://enterprise.example.com',
86
- }
87
- mockInterceptor = {}
88
-
89
- // Setup mock implementations
90
- mockGetCheckoutConfig.mockResolvedValue(mockCheckoutConfig)
91
- mockCreateGrpcTransport.mockReturnValue(mockTransport)
92
- mockCreateAuthenticationInterceptor.mockReturnValue(mockInterceptor)
93
- mockCreateHeadersInterceptor.mockReturnValue(mockInterceptor)
94
- mockCreateClient.mockReturnValue(mockAuthClient)
95
- })
96
-
97
- describe('getPolicies', () => {
98
- it('should return policies on success', async () => {
99
- const mockPolicies = [
100
- { pType: 'p', v0: 'alice', v1: 'data1', v2: 'read' },
101
- { pType: 'p', v0: 'bob', v1: 'data2', v2: 'write' },
102
- ]
103
-
104
- mockAuthClient.getPolicies.mockResolvedValue({
105
- policies: mockPolicies,
106
- })
107
-
108
- const result = await getPolicies({
109
- headers: {},
110
- })
111
-
112
- expect(getCheckoutConfig).toHaveBeenCalled()
113
- expect(createGrpcTransport).toHaveBeenCalledWith({
114
- baseUrl: mockCheckoutConfig.enterpriseURL,
115
- interceptors: [mockInterceptor, mockInterceptor],
116
- acceptCompression: expect.any(Array), // Accept gzip and Brotli compression
117
- sendCompression: expect.any(Object), // Send Brotli compression
118
- })
119
- expect(createClient).toHaveBeenCalledWith({}, mockTransport)
120
- expect(mockAuthClient.getPolicies).toHaveBeenCalledWith({})
121
-
122
- expect(result).toEqual({
123
- value: mockPolicies,
124
- status: 'success',
125
- })
126
- })
127
-
128
- it('should handle ConnectError', async () => {
129
- const connectError = {
130
- code: Code.Unauthenticated,
131
- rawMessage: 'Invalid credentials',
132
- message: 'Authentication failed',
133
- name: 'ConnectError',
134
- } as ConnectError
135
-
136
- // Make it pass instanceof check
137
- Object.setPrototypeOf(connectError, ConnectError.prototype)
138
-
139
- mockAuthClient.getPolicies.mockRejectedValue(connectError)
140
-
141
- const result = await getPolicies({
142
- headers: {},
143
- })
144
-
145
- expect(result).toEqual({
146
- ...connectError,
147
- message: 'Invalid credentials',
148
- status: 'failed',
149
- })
150
- })
151
-
152
- it('should handle unexpected errors', async () => {
153
- const unexpectedError = new Error('Network error')
154
- mockAuthClient.getPolicies.mockRejectedValue(unexpectedError)
155
-
156
- const result = await getPolicies({
157
- headers: {},
158
- })
159
-
160
- expect(result).toEqual({
161
- code: Code.Internal,
162
- rawMessage: 'An unexpected error occurred during login.',
163
- message: 'An unexpected error occurred during login.',
164
- status: 'failed',
165
- })
166
- })
167
- })
168
-
169
- describe('savePolicies', () => {
170
- it('should save policies successfully', async () => {
171
- const inputPolicies = [
172
- ['p', 'alice', 'data1', 'read'],
173
- ['p', 'bob', 'data2', 'write'],
174
- ]
175
-
176
- mockAuthClient.savePolicies.mockResolvedValue({})
177
-
178
- const result = await savePolicies({
179
- headers: {},
180
- body: { inPolicies: inputPolicies },
181
- })
182
-
183
- expect(mockAuthClient.savePolicies).toHaveBeenCalledWith({
184
- policies: [
185
- {
186
- pType: 'p',
187
- v0: 'alice',
188
- v1: 'data1',
189
- v2: 'read',
190
- v3: '',
191
- v4: '',
192
- v5: '',
193
- },
194
- {
195
- pType: 'p',
196
- v0: 'bob',
197
- v1: 'data2',
198
- v2: 'write',
199
- v3: '',
200
- v4: '',
201
- v5: '',
202
- },
203
- ],
204
- })
205
-
206
- expect(result).toEqual({ status: 'success' })
207
- })
208
-
209
- it('should handle policies with different lengths', async () => {
210
- const inputPolicies = [
211
- ['p', 'alice'],
212
- ['p', 'bob', 'data2', 'write', 'extra1', 'extra2', 'extra3', 'extra4'],
213
- ]
214
-
215
- mockAuthClient.savePolicies.mockResolvedValue({})
216
-
217
- const result = await savePolicies({
218
- headers: {},
219
- body: { inPolicies: inputPolicies },
220
- })
221
-
222
- expect(mockAuthClient.savePolicies).toHaveBeenCalledWith({
223
- policies: [
224
- { pType: 'p', v0: 'alice', v1: '', v2: '', v3: '', v4: '', v5: '' },
225
- {
226
- pType: 'p',
227
- v0: 'bob',
228
- v1: 'data2',
229
- v2: 'write',
230
- v3: 'extra1',
231
- v4: 'extra2',
232
- v5: 'extra3',
233
- },
234
- ],
235
- })
236
-
237
- expect(result).toEqual({ status: 'success' })
238
- })
239
-
240
- it('should handle ConnectError', async () => {
241
- const connectError = {
242
- code: Code.Internal,
243
- rawMessage: 'Database error',
244
- message: 'Save failed',
245
- name: 'ConnectError',
246
- } as ConnectError
247
-
248
- // Make it pass instanceof check
249
- Object.setPrototypeOf(connectError, ConnectError.prototype)
250
-
251
- mockAuthClient.savePolicies.mockRejectedValue(connectError)
252
-
253
- const result = await savePolicies({
254
- headers: {},
255
- body: { inPolicies: [['p', 'alice']] },
256
- })
257
-
258
- expect(result).toEqual({
259
- ...connectError,
260
- message: 'Database error',
261
- status: 'failed',
262
- })
263
- })
264
- })
265
-
266
- describe('addPolicy', () => {
267
- it('should add policy successfully', async () => {
268
- const rule = ['alice', 'data1', 'read']
269
- const pType = 'p'
270
-
271
- mockAuthClient.addPolicy.mockResolvedValue({})
272
-
273
- const result = await addPolicy({
274
- headers: {},
275
- body: { rule, pType },
276
- })
277
-
278
- expect(mockAuthClient.addPolicy).toHaveBeenCalledWith({ rule, pType })
279
-
280
- expect(result).toEqual({ status: 'success' })
281
- })
282
-
283
- it('should handle ConnectError', async () => {
284
- const connectError = {
285
- code: Code.InvalidArgument,
286
- rawMessage: 'Invalid policy format',
287
- message: 'Add failed',
288
- name: 'ConnectError',
289
- } as ConnectError
290
-
291
- // Make it pass instanceof check
292
- Object.setPrototypeOf(connectError, ConnectError.prototype)
293
-
294
- mockAuthClient.addPolicy.mockRejectedValue(connectError)
295
-
296
- const result = await addPolicy({
297
- headers: {},
298
- body: { rule: ['alice'], pType: 'p' },
299
- })
300
-
301
- expect(result).toEqual({
302
- ...connectError,
303
- message: 'Invalid policy format',
304
- status: 'failed',
305
- })
306
- })
307
- })
308
-
309
- describe('addPolicies', () => {
310
- it('should add multiple policies successfully', async () => {
311
- const rules = [
312
- ['alice', 'data1', 'read'],
313
- ['bob', 'data2', 'write'],
314
- ]
315
- const pType = 'p'
316
-
317
- mockAuthClient.addPolicies.mockResolvedValue({})
318
-
319
- const result = await addPolicies({
320
- headers: {},
321
- body: { inRules: rules, pType },
322
- })
323
-
324
- expect(mockAuthClient.addPolicies).toHaveBeenCalledWith({
325
- rules: [
326
- { rules: ['alice', 'data1', 'read'] },
327
- { rules: ['bob', 'data2', 'write'] },
328
- ],
329
- pType,
330
- })
331
-
332
- expect(result).toEqual({ status: 'success' })
333
- })
334
-
335
- it('should handle unexpected errors', async () => {
336
- const unexpectedError = new Error('Network timeout')
337
- mockAuthClient.addPolicies.mockRejectedValue(unexpectedError)
338
-
339
- const result = await addPolicies({
340
- headers: {},
341
- body: { inRules: [['alice']], pType: 'p' },
342
- })
343
-
344
- expect(result).toEqual({
345
- code: Code.Internal,
346
- rawMessage: 'An unexpected error occurred while adding policies.',
347
- message: 'An unexpected error occurred while adding policies.',
348
- status: 'failed',
349
- })
350
- })
351
- })
352
-
353
- describe('removePolicy', () => {
354
- it('should remove policy successfully', async () => {
355
- const rule = ['alice', 'data1', 'read']
356
- const pType = 'p'
357
-
358
- mockAuthClient.removePolicy.mockResolvedValue({})
359
-
360
- const result = await removePolicy({
361
- headers: {},
362
- body: { rule, pType },
363
- })
364
-
365
- expect(mockAuthClient.removePolicy).toHaveBeenCalledWith({ rule, pType })
366
-
367
- expect(result).toEqual({ status: 'success' })
368
- })
369
-
370
- it('should handle ConnectError', async () => {
371
- const connectError = {
372
- code: Code.NotFound,
373
- rawMessage: 'Policy not found',
374
- message: 'Remove failed',
375
- name: 'ConnectError',
376
- } as ConnectError
377
-
378
- // Make it pass instanceof check
379
- Object.setPrototypeOf(connectError, ConnectError.prototype)
380
-
381
- mockAuthClient.removePolicy.mockRejectedValue(connectError)
382
-
383
- const result = await removePolicy({
384
- headers: {},
385
- body: { rule: ['alice'], pType: 'p' },
386
- })
387
-
388
- expect(result).toEqual({
389
- ...connectError,
390
- message: 'Policy not found',
391
- status: 'failed',
392
- })
393
- })
394
- })
395
-
396
- describe('removePolicies', () => {
397
- it('should remove multiple policies successfully', async () => {
398
- const rules = [
399
- ['alice', 'data1', 'read'],
400
- ['bob', 'data2', 'write'],
401
- ]
402
- const pType = 'p'
403
-
404
- mockAuthClient.removePolicies.mockResolvedValue({})
405
-
406
- const result = await removePolicies({
407
- headers: {},
408
- body: { inRules: rules, pType },
409
- })
410
-
411
- expect(mockAuthClient.removePolicies).toHaveBeenCalledWith({
412
- rules: [
413
- { rules: ['alice', 'data1', 'read'] },
414
- { rules: ['bob', 'data2', 'write'] },
415
- ],
416
- pType,
417
- })
418
-
419
- expect(result).toEqual({ status: 'success' })
420
- })
421
- })
422
-
423
- describe('removeFilteredPolicy', () => {
424
- it('should remove filtered policy successfully', async () => {
425
- const pType = 'p'
426
- const fieldIndex = 0
427
- const fieldValues = ['alice']
428
-
429
- mockAuthClient.removeFilteredPolicy.mockResolvedValue({})
430
-
431
- const result = await removeFilteredPolicy({
432
- headers: {},
433
- body: { pType, fieldIndex, fieldValues },
434
- })
435
-
436
- expect(mockAuthClient.removeFilteredPolicy).toHaveBeenCalledWith({
437
- pType,
438
- fieldIndex,
439
- fieldValues,
440
- })
441
-
442
- expect(result).toEqual({ status: 'success' })
443
- })
444
-
445
- it('should handle ConnectError', async () => {
446
- const connectError = {
447
- code: Code.InvalidArgument,
448
- rawMessage: 'Invalid filter criteria',
449
- message: 'Filter failed',
450
- name: 'ConnectError',
451
- } as ConnectError
452
-
453
- // Make it pass instanceof check
454
- Object.setPrototypeOf(connectError, ConnectError.prototype)
455
-
456
- mockAuthClient.removeFilteredPolicy.mockRejectedValue(connectError)
457
-
458
- const result = await removeFilteredPolicy({
459
- headers: {},
460
- body: { pType: 'p', fieldIndex: 0, fieldValues: ['alice'] },
461
- })
462
-
463
- expect(result).toEqual({
464
- ...connectError,
465
- message: 'Invalid filter criteria',
466
- status: 'failed',
467
- })
468
- })
469
- })
470
-
471
- describe('getFilteredPolicy', () => {
472
- it('should get filtered policies successfully', async () => {
473
- const filter = {
474
- v0: [['alice'], ['bob']],
475
- v1: [['data1']],
476
- }
477
-
478
- const mockPolicies = [
479
- { pType: 'p', v0: 'alice', v1: 'data1', v2: 'read' },
480
- ]
481
-
482
- mockAuthClient.getFilteredPolicy.mockResolvedValue({
483
- policies: mockPolicies,
484
- })
485
-
486
- const result = await getFilteredPolicy({
487
- headers: {},
488
- body: { inFilter: filter },
489
- })
490
-
491
- expect(mockAuthClient.getFilteredPolicy).toHaveBeenCalledWith({
492
- filter: [
493
- {
494
- key: 'v0',
495
- values: [{ items: ['alice'] }, { items: ['bob'] }],
496
- },
497
- {
498
- key: 'v1',
499
- values: [{ items: ['data1'] }],
500
- },
501
- ],
502
- })
503
-
504
- expect(result).toEqual({
505
- value: mockPolicies,
506
- status: 'success',
507
- })
508
- })
509
-
510
- it('should handle empty filter', async () => {
511
- const filter = {}
512
-
513
- mockAuthClient.getFilteredPolicy.mockResolvedValue({
514
- policies: [],
515
- })
516
-
517
- const result = await getFilteredPolicy({
518
- headers: {},
519
- body: { inFilter: filter },
520
- })
521
-
522
- expect(mockAuthClient.getFilteredPolicy).toHaveBeenCalledWith({
523
- filter: [],
524
- })
525
-
526
- expect(result).toEqual({
527
- value: [],
528
- status: 'success',
529
- })
530
- })
531
-
532
- it('should handle unexpected errors', async () => {
533
- const unexpectedError = new Error('Database connection failed')
534
- mockAuthClient.getFilteredPolicy.mockRejectedValue(unexpectedError)
535
-
536
- const result = await getFilteredPolicy({
537
- headers: {},
538
- body: { inFilter: {} },
539
- })
540
-
541
- expect(result).toEqual({
542
- code: Code.Internal,
543
- rawMessage: 'An unexpected error occurred while fetching policies.',
544
- message: 'An unexpected error occurred while fetching policies.',
545
- status: 'failed',
546
- })
547
- })
548
- })
549
-
550
- describe('common functionality', () => {
551
- it('should setup transport and client consistently across all functions', async () => {
552
- // Test one function to verify the setup pattern
553
- await getPolicies({
554
- headers: {},
555
- })
556
-
557
- expect(getCheckoutConfig).toHaveBeenCalled()
558
- expect(createAuthenticationInterceptor).toHaveBeenCalledWith(
559
- mockCheckoutConfig
560
- )
561
- expect(createGrpcTransport).toHaveBeenCalledWith({
562
- baseUrl: mockCheckoutConfig.enterpriseURL,
563
- interceptors: [mockInterceptor, mockInterceptor],
564
- acceptCompression: expect.any(Array), // Accept gzip and Brotli compression
565
- sendCompression: expect.any(Object), // Send Brotli compression
566
- })
567
- expect(createClient).toHaveBeenCalledWith({}, mockTransport)
568
- })
569
-
570
- it('should use consistent timeout across all functions', async () => {
571
- mockAuthClient.getPolicies.mockResolvedValue({ policies: [] })
572
- mockAuthClient.addPolicy.mockResolvedValue({})
573
- mockAuthClient.removePolicy.mockResolvedValue({})
574
-
575
- await getPolicies({
576
- headers: {},
577
- })
578
- await addPolicy({
579
- headers: {},
580
- body: { rule: ['alice'], pType: 'p' },
581
- })
582
- await removePolicy({
583
- headers: {},
584
- body: { rule: ['bob'], pType: 'p' },
585
- })
586
-
587
- // Verify all calls use the same timeout
588
- expect(mockAuthClient.getPolicies).toHaveBeenCalledWith({})
589
- expect(mockAuthClient.addPolicy).toHaveBeenCalledWith(expect.any(Object))
590
- expect(mockAuthClient.removePolicy).toHaveBeenCalledWith(
591
- expect.any(Object)
592
- )
593
- })
594
- })
595
- })