@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address.spec.d.ts","sourceRoot":"","sources":["../../src/address.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,488 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const connect_1 = require("@connectrpc/connect");
13
+ const connect_node_1 = require("@connectrpc/connect-node");
14
+ const config_1 = require("@paakd/config");
15
+ const address_1 = require("./address");
16
+ const interceptors_1 = require("./interceptors");
17
+ const test_utils_1 = require("./test-utils");
18
+ // Mock dependencies
19
+ vi.mock('@connectrpc/connect', () => __awaiter(void 0, void 0, void 0, function* () {
20
+ const actual = yield vi.importActual('@connectrpc/connect');
21
+ return Object.assign(Object.assign({}, actual), { createClient: vi.fn() });
22
+ }));
23
+ vi.mock('@connectrpc/connect-node', () => ({
24
+ createGrpcTransport: vi.fn(),
25
+ }));
26
+ vi.mock('@paakd/config', () => ({
27
+ getCheckoutConfig: vi.fn(),
28
+ }));
29
+ vi.mock('./interceptors', () => ({
30
+ createAuthenticationInterceptor: vi.fn(),
31
+ createCustomerAuthenticationInterceptor: vi.fn(),
32
+ createHeadersInterceptor: vi.fn(),
33
+ }));
34
+ vi.mock('./compressor/brotli', () => ({
35
+ brotliCompression: {
36
+ name: 'brotli',
37
+ compress: vi.fn(),
38
+ decompress: vi.fn(),
39
+ },
40
+ }));
41
+ vi.mock('../gen/src/proto/customers/v1/service_pb', () => ({
42
+ CustomerService: {},
43
+ }));
44
+ const mockGetCheckoutConfig = vi.mocked(config_1.getCheckoutConfig);
45
+ const mockCreateGrpcTransport = vi.mocked(connect_node_1.createGrpcTransport);
46
+ const mockCreateClient = vi.mocked(connect_1.createClient);
47
+ const mockCreateHeadersInterceptor = vi.mocked(interceptors_1.createHeadersInterceptor);
48
+ const mockCreateAuthenticationInterceptor = vi.mocked(interceptors_1.createAuthenticationInterceptor);
49
+ const mockCreateCustomerAuthenticationInterceptor = vi.mocked(interceptors_1.createCustomerAuthenticationInterceptor);
50
+ function setupAddressService() {
51
+ (0, test_utils_1.clearAllMocks)();
52
+ const { config, interceptors, transport } = (0, test_utils_1.setupCommonMocks)();
53
+ const client = {
54
+ getAddresses: vi.fn(),
55
+ getAddress: vi.fn(),
56
+ addAddress: vi.fn(),
57
+ updateAddress: vi.fn(),
58
+ deleteAddress: vi.fn(),
59
+ };
60
+ mockGetCheckoutConfig.mockResolvedValue(config);
61
+ mockCreateGrpcTransport.mockReturnValue(transport);
62
+ mockCreateHeadersInterceptor.mockImplementation(() => next => (req) => __awaiter(this, void 0, void 0, function* () {
63
+ return yield next(req);
64
+ }));
65
+ mockCreateAuthenticationInterceptor.mockImplementation(() => next => (req) => __awaiter(this, void 0, void 0, function* () {
66
+ return yield next(req);
67
+ }));
68
+ mockCreateCustomerAuthenticationInterceptor.mockImplementation(() => next => (req) => __awaiter(this, void 0, void 0, function* () {
69
+ return yield next(req);
70
+ }));
71
+ mockCreateClient.mockReturnValue(client);
72
+ return {
73
+ client,
74
+ config,
75
+ interceptors,
76
+ transport,
77
+ };
78
+ }
79
+ describe('Address Service', () => {
80
+ let consoleSpy;
81
+ beforeEach(() => {
82
+ consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
83
+ });
84
+ afterEach(() => {
85
+ consoleSpy.mockRestore();
86
+ });
87
+ describe('getAddresses', () => {
88
+ it('should successfully fetch all addresses for a customer', () => __awaiter(void 0, void 0, void 0, function* () {
89
+ const { client } = setupAddressService();
90
+ const mockAddresses = [
91
+ {
92
+ id: 'addr-1',
93
+ customerId: 'cust-1',
94
+ street: '123 Main St',
95
+ city: 'New York',
96
+ },
97
+ {
98
+ id: 'addr-2',
99
+ customerId: 'cust-1',
100
+ street: '456 Oak Ave',
101
+ city: 'Los Angeles',
102
+ },
103
+ ];
104
+ client.getAddresses.mockResolvedValue({ addresses: mockAddresses });
105
+ const result = yield (0, address_1.getAddresses)({
106
+ body: {
107
+ customerId: 'cust-1',
108
+ jwt: 'token-123',
109
+ },
110
+ headers: {},
111
+ });
112
+ expect(result.status === 'success' && result.value).toBe(mockAddresses);
113
+ }));
114
+ it('should handle customer not found error', () => __awaiter(void 0, void 0, void 0, function* () {
115
+ const { client } = setupAddressService();
116
+ const error = (0, test_utils_1.createMockConnectError)(5, 'NOT_FOUND', 'Customer not found');
117
+ client.getAddresses.mockRejectedValue(error);
118
+ const result = yield (0, address_1.getAddresses)({
119
+ body: {
120
+ customerId: 'invalid-customer',
121
+ jwt: 'token-123',
122
+ },
123
+ headers: {},
124
+ });
125
+ expect(result.status).toBe('failed');
126
+ expect(result.code).toBe(5);
127
+ }));
128
+ it('should reject request with invalid JWT', () => __awaiter(void 0, void 0, void 0, function* () {
129
+ const { client } = setupAddressService();
130
+ const error = (0, test_utils_1.createMockConnectError)(16, 'UNAUTHENTICATED', 'Invalid JWT token');
131
+ client.getAddresses.mockRejectedValue(error);
132
+ const result = yield (0, address_1.getAddresses)({
133
+ body: {
134
+ customerId: 'cust-1',
135
+ jwt: 'invalid-token',
136
+ },
137
+ headers: {},
138
+ });
139
+ expect(result.status).toBe('failed');
140
+ }));
141
+ it('should return empty list when customer has no addresses', () => __awaiter(void 0, void 0, void 0, function* () {
142
+ const { client } = setupAddressService();
143
+ client.getAddresses.mockResolvedValue({ addresses: [] });
144
+ const result = yield (0, address_1.getAddresses)({
145
+ body: {
146
+ customerId: 'cust-1',
147
+ jwt: 'token-123',
148
+ },
149
+ headers: {},
150
+ });
151
+ expect(result.status).toBe('success');
152
+ expect(result.value).toEqual([]);
153
+ }));
154
+ });
155
+ describe('getAddress', () => {
156
+ it('should successfully fetch a single address', () => __awaiter(void 0, void 0, void 0, function* () {
157
+ const { client } = setupAddressService();
158
+ const mockAddress = {
159
+ id: 'addr-1',
160
+ customerId: 'cust-1',
161
+ street: '123 Main St',
162
+ city: 'New York',
163
+ state: 'NY',
164
+ zipCode: '10001',
165
+ };
166
+ client.getAddress.mockResolvedValue(mockAddress);
167
+ const result = yield (0, address_1.getAddress)({
168
+ body: {
169
+ customerId: 'cust-1',
170
+ addressId: 'addr-1',
171
+ jwt: 'token-123',
172
+ },
173
+ headers: {},
174
+ });
175
+ expect(result.status).toBe('success');
176
+ expect(result.value).toEqual(mockAddress);
177
+ }));
178
+ it('should return not found when address does not exist', () => __awaiter(void 0, void 0, void 0, function* () {
179
+ const { client } = setupAddressService();
180
+ const error = (0, test_utils_1.createMockConnectError)(5, 'NOT_FOUND', 'Address not found');
181
+ client.getAddress.mockRejectedValue(error);
182
+ const result = yield (0, address_1.getAddress)({
183
+ body: {
184
+ customerId: 'cust-1',
185
+ addressId: 'invalid-addr',
186
+ jwt: 'token-123',
187
+ },
188
+ headers: {},
189
+ });
190
+ expect(result.status).toBe('failed');
191
+ }));
192
+ it('should require valid JWT', () => __awaiter(void 0, void 0, void 0, function* () {
193
+ const { client } = setupAddressService();
194
+ const error = (0, test_utils_1.createMockConnectError)(16, 'UNAUTHENTICATED', 'Unauthenticated');
195
+ client.getAddress.mockRejectedValue(error);
196
+ const result = yield (0, address_1.getAddress)({
197
+ body: {
198
+ customerId: 'cust-1',
199
+ addressId: 'addr-1',
200
+ jwt: '',
201
+ },
202
+ headers: {},
203
+ });
204
+ expect(result.status).toBe('failed');
205
+ }));
206
+ });
207
+ describe('addAddress', () => {
208
+ it('should successfully add a new address', () => __awaiter(void 0, void 0, void 0, function* () {
209
+ const { client } = setupAddressService();
210
+ const newAddress = {
211
+ customerId: 'cust-1',
212
+ firstName: 'Jane',
213
+ lastName: 'Doe',
214
+ address1: '789 Pine St',
215
+ address2: '',
216
+ address3: '',
217
+ city: 'Chicago',
218
+ zipCode: '60601',
219
+ country: 'US',
220
+ phoneNumber: '555-9999',
221
+ };
222
+ const mockResponse = {
223
+ address: Object.assign({ id: 'addr-3' }, newAddress),
224
+ };
225
+ client.addAddress.mockResolvedValue(mockResponse);
226
+ const result = yield (0, address_1.addAddress)({
227
+ body: Object.assign(Object.assign({}, newAddress), { jwt: 'token-123' }),
228
+ headers: {},
229
+ });
230
+ expect(result.status).toBe('success');
231
+ expect(result.value).toEqual(mockResponse.address);
232
+ }));
233
+ it('should reject invalid address data', () => __awaiter(void 0, void 0, void 0, function* () {
234
+ const { client } = setupAddressService();
235
+ const error = (0, test_utils_1.createMockConnectError)(3, 'INVALID_ARGUMENT', 'Invalid address data');
236
+ client.addAddress.mockRejectedValue(error);
237
+ const result = yield (0, address_1.addAddress)({
238
+ body: {
239
+ customerId: 'cust-1',
240
+ firstName: 'Jane',
241
+ lastName: 'Doe',
242
+ address1: '',
243
+ address2: '',
244
+ address3: '',
245
+ city: '',
246
+ zipCode: '',
247
+ country: 'US',
248
+ phoneNumber: '555-1234',
249
+ jwt: 'token-123',
250
+ },
251
+ headers: {},
252
+ });
253
+ expect(result.status).toBe('failed');
254
+ }));
255
+ it('should reject requests without authentication', () => __awaiter(void 0, void 0, void 0, function* () {
256
+ const { client } = setupAddressService();
257
+ const error = (0, test_utils_1.createMockConnectError)(16, 'UNAUTHENTICATED', 'Authentication required');
258
+ client.addAddress.mockRejectedValue(error);
259
+ const result = yield (0, address_1.addAddress)({
260
+ body: {
261
+ customerId: 'cust-1',
262
+ firstName: 'Jane',
263
+ lastName: 'Doe',
264
+ address1: '789 Pine St',
265
+ address2: '',
266
+ address3: '',
267
+ city: 'Chicago',
268
+ zipCode: '60601',
269
+ country: 'US',
270
+ phoneNumber: '555-1234',
271
+ jwt: 'invalid-token',
272
+ },
273
+ headers: {},
274
+ });
275
+ expect(result.status).toBe('failed');
276
+ }));
277
+ });
278
+ describe('updateAddress', () => {
279
+ it('should successfully update an existing address', () => __awaiter(void 0, void 0, void 0, function* () {
280
+ const { client } = setupAddressService();
281
+ const updateData = {
282
+ id: 'addr-1',
283
+ customerId: 'cust-1',
284
+ firstName: 'John',
285
+ lastName: 'Doe',
286
+ address1: '123 Main St Updated',
287
+ address2: '',
288
+ address3: '',
289
+ city: 'New York',
290
+ zipCode: '10001',
291
+ country: 'US',
292
+ phoneNumber: '555-1234',
293
+ };
294
+ const mockResponse = {
295
+ address: Object.assign(Object.assign({}, updateData), { zipCode: '10001' }),
296
+ };
297
+ client.updateAddress.mockResolvedValue(mockResponse);
298
+ const result = yield (0, address_1.updateAddress)({
299
+ body: Object.assign(Object.assign({}, updateData), { jwt: 'token-123' }),
300
+ headers: {},
301
+ });
302
+ expect(result.status).toBe('success');
303
+ expect(result.value).toEqual(mockResponse.address);
304
+ }));
305
+ it('should return not found for non-existent address', () => __awaiter(void 0, void 0, void 0, function* () {
306
+ const { client } = setupAddressService();
307
+ const error = (0, test_utils_1.createMockConnectError)(5, 'NOT_FOUND', 'Address not found');
308
+ client.updateAddress.mockRejectedValue(error);
309
+ const result = yield (0, address_1.updateAddress)({
310
+ body: {
311
+ id: 'addr-1',
312
+ customerId: 'cust-1',
313
+ firstName: 'John',
314
+ lastName: 'Doe',
315
+ addressId: 'addr-1',
316
+ street: 'Some St',
317
+ address1: 'Some St',
318
+ address2: '',
319
+ city: 'Some City',
320
+ state: 'NY',
321
+ zipCode: '10001',
322
+ country: 'US',
323
+ phoneNumber: '555-1234',
324
+ jwt: 'token-123',
325
+ },
326
+ headers: {},
327
+ });
328
+ expect(result.status).toBe('failed');
329
+ }));
330
+ it('should reject updates with invalid data', () => __awaiter(void 0, void 0, void 0, function* () {
331
+ const { client } = setupAddressService();
332
+ const error = (0, test_utils_1.createMockConnectError)(3, 'INVALID_ARGUMENT', 'Invalid update data');
333
+ client.updateAddress.mockRejectedValue(error);
334
+ const result = yield (0, address_1.updateAddress)({
335
+ body: {
336
+ id: 'addr-1',
337
+ customerId: 'cust-1',
338
+ street: '',
339
+ city: '',
340
+ jwt: 'token-123',
341
+ },
342
+ headers: {},
343
+ });
344
+ expect(result.status).toBe('failed');
345
+ }));
346
+ });
347
+ describe('deleteAddress', () => {
348
+ it('should successfully delete an address', () => __awaiter(void 0, void 0, void 0, function* () {
349
+ const { client } = setupAddressService();
350
+ const mockResponse = {
351
+ success: true,
352
+ };
353
+ client.deleteAddress.mockResolvedValue(mockResponse);
354
+ const result = yield (0, address_1.deleteAddress)({
355
+ body: {
356
+ customerId: 'cust-1',
357
+ addressId: 'addr-1',
358
+ jwt: 'token-123',
359
+ },
360
+ headers: {},
361
+ });
362
+ expect(result.status).toBe('success');
363
+ expect(result.value).toEqual(mockResponse);
364
+ }));
365
+ it('should return not found when address does not exist', () => __awaiter(void 0, void 0, void 0, function* () {
366
+ const { client } = setupAddressService();
367
+ const error = (0, test_utils_1.createMockConnectError)(5, 'NOT_FOUND', 'Address not found');
368
+ client.deleteAddress.mockRejectedValue(error);
369
+ const result = yield (0, address_1.deleteAddress)({
370
+ body: {
371
+ customerId: 'cust-1',
372
+ addressId: 'invalid-addr',
373
+ jwt: 'token-123',
374
+ },
375
+ headers: {},
376
+ });
377
+ expect(result.status).toBe('failed');
378
+ }));
379
+ it('should reject deletion without authentication', () => __awaiter(void 0, void 0, void 0, function* () {
380
+ const { client } = setupAddressService();
381
+ const error = (0, test_utils_1.createMockConnectError)(16, 'UNAUTHENTICATED', 'Authentication required');
382
+ client.deleteAddress.mockRejectedValue(error);
383
+ const result = yield (0, address_1.deleteAddress)({
384
+ body: {
385
+ customerId: 'cust-1',
386
+ addressId: 'addr-1',
387
+ jwt: 'invalid-token',
388
+ },
389
+ headers: {},
390
+ });
391
+ expect(result.status).toBe('failed');
392
+ }));
393
+ it('should handle service errors gracefully', () => __awaiter(void 0, void 0, void 0, function* () {
394
+ const { client } = setupAddressService();
395
+ const error = (0, test_utils_1.createMockConnectError)(13, 'INTERNAL', 'Internal server error');
396
+ client.deleteAddress.mockRejectedValue(error);
397
+ const result = yield (0, address_1.deleteAddress)({
398
+ body: {
399
+ customerId: 'cust-1',
400
+ addressId: 'addr-1',
401
+ jwt: 'token-123',
402
+ },
403
+ headers: {},
404
+ });
405
+ expect(result.status).toBe('failed');
406
+ expect(result.code).toBe(connect_1.Code.Internal);
407
+ }));
408
+ });
409
+ describe('Address Service - Common Behavior', () => {
410
+ it('should apply all interceptors correctly', () => __awaiter(void 0, void 0, void 0, function* () {
411
+ const { client } = setupAddressService();
412
+ client.getAddresses.mockResolvedValue({ addresses: [] });
413
+ const headers = {
414
+ 'x-shop-id': '123',
415
+ 'x-locale': 'en-US',
416
+ };
417
+ yield (0, address_1.getAddresses)({
418
+ body: {
419
+ customerId: 'cust-1',
420
+ jwt: 'token-123',
421
+ },
422
+ headers,
423
+ });
424
+ expect(mockCreateHeadersInterceptor).toHaveBeenCalledWith(headers);
425
+ expect(mockCreateAuthenticationInterceptor).toHaveBeenCalled();
426
+ expect(mockCreateCustomerAuthenticationInterceptor).toHaveBeenCalledWith('token-123');
427
+ }));
428
+ it('should load configuration for each request', () => __awaiter(void 0, void 0, void 0, function* () {
429
+ const { client } = setupAddressService();
430
+ client.getAddresses.mockResolvedValue({ addresses: [] });
431
+ yield (0, address_1.getAddresses)({
432
+ body: {
433
+ customerId: 'cust-1',
434
+ jwt: 'token-123',
435
+ },
436
+ headers: {},
437
+ });
438
+ expect(mockGetCheckoutConfig).toHaveBeenCalled();
439
+ }));
440
+ it('should create transport with compression enabled', () => __awaiter(void 0, void 0, void 0, function* () {
441
+ const { client } = setupAddressService();
442
+ client.getAddresses.mockResolvedValue({ addresses: [] });
443
+ yield (0, address_1.getAddresses)({
444
+ body: {
445
+ customerId: 'cust-1',
446
+ jwt: 'token-123',
447
+ },
448
+ headers: {},
449
+ });
450
+ expect(mockCreateGrpcTransport).toHaveBeenCalledWith(expect.objectContaining({
451
+ acceptCompression: expect.any(Array),
452
+ sendCompression: expect.any(Object),
453
+ }));
454
+ }));
455
+ it('should handle concurrent requests independently', () => __awaiter(void 0, void 0, void 0, function* () {
456
+ const { client } = setupAddressService();
457
+ const mockAddresses = [
458
+ { id: 'addr-1', customerId: 'cust-1', street: '123 Main St' },
459
+ ];
460
+ client.getAddresses.mockResolvedValue({ addresses: mockAddresses });
461
+ const results = yield Promise.all([
462
+ (0, address_1.getAddresses)({
463
+ body: {
464
+ customerId: 'cust-1',
465
+ jwt: 'token-1',
466
+ },
467
+ headers: {},
468
+ }),
469
+ (0, address_1.getAddresses)({
470
+ body: {
471
+ customerId: 'cust-2',
472
+ jwt: 'token-2',
473
+ },
474
+ headers: {},
475
+ }),
476
+ (0, address_1.getAddresses)({
477
+ body: {
478
+ customerId: 'cust-3',
479
+ jwt: 'token-3',
480
+ },
481
+ headers: {},
482
+ }),
483
+ ]);
484
+ expect(results).toHaveLength(3);
485
+ expect(results.every(r => r.status === 'success')).toBe(true);
486
+ }));
487
+ });
488
+ });
@@ -0,0 +1,27 @@
1
+ import type { ChangePasswordRequest } from '../gen/src/proto/customers/v1/entities/profile_pb';
2
+ import type { LoginResponse } from '../gen/src/proto/auth/v1/entities/auth_pb';
3
+ import type { ApiResponse, SuccessResponse, ErrorResponse } from './address';
4
+ export interface LoginRequestProps {
5
+ body: {
6
+ email: string;
7
+ password: string;
8
+ };
9
+ headers: Record<string, string | null>;
10
+ }
11
+ export interface RefreshTokenRequestProps {
12
+ body: {
13
+ refreshToken: string;
14
+ };
15
+ headers: Record<string, string | null>;
16
+ }
17
+ export interface ChangePasswordRequestProps {
18
+ body: ChangePasswordRequest & {
19
+ jwt: string;
20
+ };
21
+ headers: Record<string, string | null>;
22
+ }
23
+ export type { ApiResponse, SuccessResponse, ErrorResponse };
24
+ export declare function login({ body: { email, password }, headers, }: LoginRequestProps): Promise<ApiResponse<LoginResponse>>;
25
+ export declare function refreshToken({ body: { refreshToken }, headers, }: RefreshTokenRequestProps): Promise<ApiResponse<LoginResponse>>;
26
+ export declare function changePassword({ body: { jwt, ...prop }, headers, }: ChangePasswordRequestProps): Promise<ApiResponse<any>>;
27
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mDAAmD,CAAA;AAE9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAA;AAO9E,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAE5E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAA;KACrB,CAAA;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,qBAAqB,GAAG;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACvC;AAGD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,CAAA;AAE3D,wBAAsB,KAAK,CAAC,EAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EACzB,OAAO,GACR,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAwCzD;AAED,wBAAsB,YAAY,CAAC,EACjC,IAAI,EAAE,EAAE,YAAY,EAAE,EACtB,OAAO,GACR,EAAE,wBAAwB,GAAG,OAAO,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAsChE;AAED,wBAAsB,cAAc,CAAC,EACnC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EACtB,OAAO,GACR,EAAE,0BAA0B,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAsCxD"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __rest = (this && this.__rest) || function (s, e) {
12
+ var t = {};
13
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
14
+ t[p] = s[p];
15
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
16
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
17
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
18
+ t[p[i]] = s[p[i]];
19
+ }
20
+ return t;
21
+ };
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.login = login;
24
+ exports.refreshToken = refreshToken;
25
+ exports.changePassword = changePassword;
26
+ const connect_1 = require("@connectrpc/connect");
27
+ const connect_node_1 = require("@connectrpc/connect-node");
28
+ const config_1 = require("@paakd/config");
29
+ const service_pb_1 = require("../gen/src/proto/auth/v1/service_pb");
30
+ const service_pb_2 = require("../gen/src/proto/customers/v1/service_pb");
31
+ const brotli_1 = require("./compressor/brotli");
32
+ const interceptors_1 = require("./interceptors");
33
+ function login(_a) {
34
+ return __awaiter(this, arguments, void 0, function* ({ body: { email, password }, headers, }) {
35
+ const checkoutConfig = yield (0, config_1.getCheckoutConfig)();
36
+ const transport = (0, connect_node_1.createGrpcTransport)({
37
+ baseUrl: checkoutConfig.enterpriseURL,
38
+ interceptors: [
39
+ (0, interceptors_1.createHeadersInterceptor)(headers),
40
+ (0, interceptors_1.createAuthenticationInterceptor)(checkoutConfig),
41
+ ],
42
+ acceptCompression: [brotli_1.brotliCompression],
43
+ sendCompression: brotli_1.brotliCompression,
44
+ });
45
+ const auth = (0, connect_1.createClient)(service_pb_1.AuthService, transport);
46
+ try {
47
+ const value = yield auth.login({
48
+ email,
49
+ password,
50
+ });
51
+ console.log('Login successful for email:', email);
52
+ return {
53
+ value,
54
+ status: 'success',
55
+ };
56
+ }
57
+ catch (err) {
58
+ console.log('Error during login:', err);
59
+ if (err instanceof connect_1.ConnectError) {
60
+ return {
61
+ code: err.code,
62
+ rawMessage: err.rawMessage,
63
+ message: err.rawMessage,
64
+ status: 'failed',
65
+ };
66
+ }
67
+ return {
68
+ code: connect_1.Code.Internal,
69
+ rawMessage: 'An unexpected error occurred during login.',
70
+ message: 'An unexpected error occurred during login.',
71
+ status: 'failed',
72
+ };
73
+ }
74
+ });
75
+ }
76
+ function refreshToken(_a) {
77
+ return __awaiter(this, arguments, void 0, function* ({ body: { refreshToken }, headers, }) {
78
+ const checkoutConfig = yield (0, config_1.getCheckoutConfig)();
79
+ const transport = (0, connect_node_1.createGrpcTransport)({
80
+ baseUrl: checkoutConfig.enterpriseURL,
81
+ interceptors: [
82
+ (0, interceptors_1.createHeadersInterceptor)(headers),
83
+ (0, interceptors_1.createAuthenticationInterceptor)(checkoutConfig),
84
+ ],
85
+ acceptCompression: [brotli_1.brotliCompression],
86
+ sendCompression: brotli_1.brotliCompression,
87
+ });
88
+ const auth = (0, connect_1.createClient)(service_pb_1.AuthService, transport);
89
+ try {
90
+ const value = yield auth.refreshToken({
91
+ refreshToken,
92
+ });
93
+ return {
94
+ value,
95
+ status: 'success',
96
+ };
97
+ }
98
+ catch (err) {
99
+ if (err instanceof connect_1.ConnectError) {
100
+ return {
101
+ code: err.code,
102
+ rawMessage: err.rawMessage,
103
+ message: err.rawMessage,
104
+ status: 'failed',
105
+ };
106
+ }
107
+ return {
108
+ code: connect_1.Code.Internal,
109
+ rawMessage: 'An unexpected error occurred while refreshing the token.',
110
+ message: 'An unexpected error occurred while refreshing the token.',
111
+ status: 'failed',
112
+ };
113
+ }
114
+ });
115
+ }
116
+ function changePassword(_a) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ var _b = _a.body, { jwt } = _b, prop = __rest(_b, ["jwt"]), { headers } = _a;
119
+ const checkoutConfig = yield (0, config_1.getCheckoutConfig)();
120
+ const transport = (0, connect_node_1.createGrpcTransport)({
121
+ baseUrl: checkoutConfig.enterpriseURL,
122
+ interceptors: [
123
+ (0, interceptors_1.createHeadersInterceptor)(headers),
124
+ (0, interceptors_1.createAuthenticationInterceptor)(checkoutConfig),
125
+ (0, interceptors_1.createCustomerAuthenticationInterceptor)(jwt),
126
+ ],
127
+ acceptCompression: [brotli_1.brotliCompression],
128
+ sendCompression: brotli_1.brotliCompression,
129
+ });
130
+ const profile = (0, connect_1.createClient)(service_pb_2.CustomerService, transport);
131
+ try {
132
+ const value = yield profile.changePassword(prop);
133
+ return {
134
+ value,
135
+ status: 'success',
136
+ };
137
+ }
138
+ catch (err) {
139
+ if (err instanceof connect_1.ConnectError) {
140
+ return {
141
+ code: err.code,
142
+ rawMessage: err.rawMessage,
143
+ message: err.rawMessage,
144
+ status: 'failed',
145
+ };
146
+ }
147
+ return {
148
+ code: connect_1.Code.Internal,
149
+ rawMessage: 'profile change password failed',
150
+ message: 'An unexpected error occurred during profile change password.',
151
+ status: 'failed',
152
+ };
153
+ }
154
+ });
155
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.spec.d.ts.map