@superblocksteam/sabs-client 0.127.0

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.
@@ -0,0 +1,3 @@
1
+ ./build
2
+ ./node_modules
3
+ .github
package/.prettierrc ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "semi": true,
3
+ "trailingComma": "none",
4
+ "singleQuote": true,
5
+ "tabWidth": 2,
6
+ "printWidth": 140,
7
+ "arrowParens": "always"
8
+ }
@@ -0,0 +1,2 @@
1
+ export * from './sabs';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./sabs"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB"}
package/dist/sabs.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ import { ApplicationMetadata, BuildResponse, BuildStatus, ListResponse, StatusResponse, TerminateResponse, BulkStatusResponse, CreateLiveEditResponse } from '@superblocksteam/sabs-types';
2
+ export declare class SabsClient {
3
+ private readonly baseUrl;
4
+ constructor(baseUrl: string);
5
+ build({ directoryHash, meta, buildKey, accessToken }: {
6
+ directoryHash: string;
7
+ meta: ApplicationMetadata;
8
+ buildKey: string;
9
+ accessToken?: string;
10
+ }): Promise<BuildResponse>;
11
+ status({ buildId, accessToken }: {
12
+ buildId: string;
13
+ accessToken?: string;
14
+ }): Promise<StatusResponse>;
15
+ bulkStatus({ organizationId, applicationId, directoryHashes, accessToken }: {
16
+ organizationId: string;
17
+ applicationId: string;
18
+ directoryHashes: string[];
19
+ accessToken?: string;
20
+ }): Promise<BulkStatusResponse>;
21
+ list({ organizationId, applicationId, directoryHash, accessToken }: {
22
+ organizationId: string;
23
+ applicationId: string;
24
+ directoryHash: string;
25
+ accessToken?: string;
26
+ }): Promise<ListResponse>;
27
+ terminate({ buildId, status, buildKey, error, accessToken }: {
28
+ buildId: string;
29
+ status: BuildStatus;
30
+ buildKey?: string;
31
+ error?: string;
32
+ accessToken?: string;
33
+ }): Promise<TerminateResponse>;
34
+ createLiveEdit({ applicationId, organizationId, branch, expiresIn, accessToken }: {
35
+ applicationId: string;
36
+ organizationId: string;
37
+ branch: string;
38
+ expiresIn: number;
39
+ accessToken: string;
40
+ }): Promise<CreateLiveEditResponse>;
41
+ private executeRequest;
42
+ }
43
+ //# sourceMappingURL=sabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabs.d.ts","sourceRoot":"","sources":["../src/sabs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EAEnB,aAAa,EACb,WAAW,EAEX,YAAY,EACZ,cAAc,EAEd,iBAAiB,EAEjB,kBAAkB,EAElB,sBAAsB,EACvB,MAAM,6BAA6B,CAAC;AAGrC,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEd,OAAO,EAAE,MAAM;IAIrB,KAAK,CAAC,EACjB,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,WAAW,EACZ,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,IAAI,EAAE,mBAAmB,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;IAiBb,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAUpG,UAAU,CAAC,EACtB,cAAc,EACd,aAAa,EACb,eAAe,EACf,WAAW,EACZ,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiBlB,IAAI,CAAC,EAChB,cAAc,EACd,aAAa,EACb,aAAa,EACb,WAAW,EACZ,EAAE;QACD,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBZ,SAAS,CAAC,EACrB,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,WAAW,EACZ,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,WAAW,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkBjB,cAAc,CAAC,EAC1B,aAAa,EACb,cAAc,EACd,MAAM,EACN,SAAS,EACT,WAAW,EACZ,EAAE;QACD,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,GAAG,OAAO,CAAC,sBAAsB,CAAC;YAqBrB,cAAc;CAwB7B"}
package/dist/sabs.js ADDED
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SabsClient = void 0;
7
+ const sabs_types_1 = require("@superblocksteam/sabs-types");
8
+ const axios_1 = __importDefault(require("axios"));
9
+ class SabsClient {
10
+ baseUrl;
11
+ constructor(baseUrl) {
12
+ this.baseUrl = baseUrl;
13
+ }
14
+ async build({ directoryHash, meta, buildKey, accessToken }) {
15
+ const data = new sabs_types_1.BuildRequest({
16
+ directoryHash: directoryHash,
17
+ applicationMetadata: meta,
18
+ buildKey
19
+ });
20
+ return this.executeRequest({
21
+ method: 'POST',
22
+ url: `${this.baseUrl}/v1/builds`,
23
+ data
24
+ }, accessToken);
25
+ }
26
+ async status({ buildId, accessToken }) {
27
+ return this.executeRequest({
28
+ method: 'GET',
29
+ url: `${this.baseUrl}/v1/builds/${buildId}`
30
+ }, accessToken);
31
+ }
32
+ async bulkStatus({ organizationId, applicationId, directoryHashes, accessToken }) {
33
+ const data = new sabs_types_1.BulkStatusRequest({
34
+ organizationId,
35
+ applicationId,
36
+ directoryHashes
37
+ });
38
+ return this.executeRequest({
39
+ method: 'POST',
40
+ url: `${this.baseUrl}/v1/builds/${organizationId}/${applicationId}/bulk-status`,
41
+ data
42
+ }, accessToken);
43
+ }
44
+ async list({ organizationId, applicationId, directoryHash, accessToken }) {
45
+ const data = new sabs_types_1.ListRequest({
46
+ organizationId,
47
+ applicationId,
48
+ directoryHash
49
+ });
50
+ return this.executeRequest({
51
+ method: 'GET',
52
+ url: `${this.baseUrl}/v1/build`,
53
+ params: data
54
+ }, accessToken);
55
+ }
56
+ async terminate({ buildId, status, buildKey, error, accessToken }) {
57
+ const data = new sabs_types_1.TerminateRequest({
58
+ buildId,
59
+ status,
60
+ error,
61
+ buildKey
62
+ });
63
+ return this.executeRequest({
64
+ method: 'POST',
65
+ url: `${this.baseUrl}/v1/builds/${buildId}/terminate`,
66
+ data
67
+ }, accessToken);
68
+ }
69
+ async createLiveEdit({ applicationId, organizationId, branch, expiresIn, accessToken }) {
70
+ const data = new sabs_types_1.CreateLiveEditRequest({
71
+ application: {
72
+ applicationId,
73
+ organizationId: organizationId,
74
+ branch: branch
75
+ },
76
+ sessionJwt: accessToken,
77
+ expiresIn: BigInt(expiresIn)
78
+ });
79
+ return this.executeRequest({
80
+ method: 'POST',
81
+ url: `${this.baseUrl}/v1/live-edit`,
82
+ data
83
+ }, accessToken);
84
+ }
85
+ async executeRequest(config, accessToken) {
86
+ let headers;
87
+ if (accessToken || config.headers) {
88
+ headers = {
89
+ ...config.headers,
90
+ Authorization: accessToken ? `Bearer ${accessToken}` : undefined
91
+ };
92
+ }
93
+ try {
94
+ const response = await axios_1.default.request({
95
+ ...config,
96
+ headers
97
+ });
98
+ return response.data;
99
+ }
100
+ catch (error) {
101
+ let errMsg = `sabs service request failed: ${error.message}`;
102
+ if (axios_1.default.isAxiosError(error)) {
103
+ errMsg += `\n[${error.response?.status}] ${error.response?.statusText}: ${JSON.stringify(error.response?.data)}`;
104
+ }
105
+ throw new Error(errMsg);
106
+ }
107
+ }
108
+ }
109
+ exports.SabsClient = SabsClient;
110
+ //# sourceMappingURL=sabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabs.js","sourceRoot":"","sources":["../src/sabs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sabs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabs.test.d.ts","sourceRoot":"","sources":["../src/sabs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,404 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const sabs_types_1 = require("@superblocksteam/sabs-types");
37
+ const axios_1 = __importStar(require("axios"));
38
+ const sabs_1 = require("./sabs");
39
+ describe('sabs service', () => {
40
+ let anyBuildKey;
41
+ beforeEach(() => {
42
+ anyBuildKey = 'any-secret-build-key';
43
+ });
44
+ afterEach(() => {
45
+ jest.restoreAllMocks();
46
+ });
47
+ describe('build', () => {
48
+ test.each([
49
+ { accessToken: 'anyScopedJwt', expectedHeaders: { Authorization: 'Bearer anyScopedJwt' } },
50
+ { accessToken: undefined, expectedHeaders: undefined }
51
+ ])('returns expected response with accessToken=$accessToken', async ({ accessToken, expectedHeaders }) => {
52
+ const expectedBuildId = 'expectedBuildId';
53
+ const expectedCreated = new Date();
54
+ const expectedUpdated = new Date();
55
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
56
+ mockAxios.mockResolvedValue({
57
+ data: {
58
+ buildId: expectedBuildId,
59
+ created: expectedCreated,
60
+ updated: expectedUpdated
61
+ }
62
+ });
63
+ const anyDirectoryHash = 'anyDirectoryHash';
64
+ const anyApplicationMetadata = new sabs_types_1.ApplicationMetadata({
65
+ id: 'anyApplicationId',
66
+ organizationId: 'anyOrganizationId'
67
+ });
68
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
69
+ const result = await sabs.build({
70
+ directoryHash: anyDirectoryHash,
71
+ meta: anyApplicationMetadata,
72
+ buildKey: anyBuildKey,
73
+ accessToken
74
+ });
75
+ expect(result).toEqual({
76
+ buildId: expectedBuildId,
77
+ created: expectedCreated,
78
+ updated: expectedUpdated
79
+ });
80
+ expect(mockAxios).toHaveBeenCalledWith({
81
+ method: 'POST',
82
+ url: 'http://localhost:3000/v1/builds',
83
+ headers: expectedHeaders,
84
+ data: {
85
+ directoryHash: anyDirectoryHash,
86
+ applicationMetadata: anyApplicationMetadata,
87
+ buildKey: anyBuildKey
88
+ }
89
+ });
90
+ });
91
+ test('raises error when request fails', async () => {
92
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
93
+ mockAxios.mockRejectedValue(new Error('any error'));
94
+ const anyDirectoryHash = 'anyDirectoryHash';
95
+ const anyApplicationMetadata = new sabs_types_1.ApplicationMetadata({
96
+ id: 'anyApplicationId',
97
+ organizationId: 'anyOrganizationId'
98
+ });
99
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
100
+ await expect(sabs.build({ directoryHash: anyDirectoryHash, meta: anyApplicationMetadata, buildKey: anyBuildKey })).rejects.toThrow();
101
+ expect(mockAxios).toHaveBeenCalledWith({
102
+ method: 'POST',
103
+ url: 'http://localhost:3000/v1/builds',
104
+ data: {
105
+ directoryHash: anyDirectoryHash,
106
+ applicationMetadata: anyApplicationMetadata,
107
+ buildKey: anyBuildKey
108
+ }
109
+ });
110
+ });
111
+ });
112
+ describe('status', () => {
113
+ test.each([
114
+ { accessToken: 'anyScopedJwt', expectedHeaders: { Authorization: 'Bearer anyScopedJwt' } },
115
+ { accessToken: undefined, expectedHeaders: undefined }
116
+ ])('returns expected response with accessToken=$accessToken', async ({ accessToken, expectedHeaders }) => {
117
+ const expectedBuildId = 'expectedBuildId';
118
+ const expectedStatus = sabs_types_1.BuildStatus.SUCCESS;
119
+ const expectedCreated = new Date();
120
+ const expectedUpdated = new Date();
121
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
122
+ mockAxios.mockResolvedValue({
123
+ data: {
124
+ buildId: expectedBuildId,
125
+ status: expectedStatus,
126
+ created: expectedCreated,
127
+ updated: expectedUpdated
128
+ }
129
+ });
130
+ const anyBuildId = 'anyBuildId';
131
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
132
+ const result = await sabs.status({ buildId: anyBuildId, accessToken });
133
+ expect(result).toEqual({
134
+ buildId: expectedBuildId,
135
+ status: expectedStatus,
136
+ created: expectedCreated,
137
+ updated: expectedUpdated
138
+ });
139
+ expect(mockAxios).toHaveBeenCalledWith({
140
+ method: 'GET',
141
+ url: `http://localhost:3000/v1/builds/${anyBuildId}`,
142
+ headers: expectedHeaders
143
+ });
144
+ });
145
+ test('raises error when request fails', async () => {
146
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
147
+ mockAxios.mockRejectedValue(new Error('any error'));
148
+ const anyBuildId = 'anyBuildId';
149
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
150
+ await expect(sabs.status({ buildId: anyBuildId })).rejects.toThrow();
151
+ expect(mockAxios).toHaveBeenCalledWith({
152
+ method: 'GET',
153
+ url: `http://localhost:3000/v1/builds/${anyBuildId}`
154
+ });
155
+ });
156
+ });
157
+ describe('list', () => {
158
+ test.each([
159
+ { accessToken: 'anyScopedJwt', expectedHeaders: { Authorization: 'Bearer anyScopedJwt' } },
160
+ { accessToken: undefined, expectedHeaders: undefined }
161
+ ])('returns expected response with accessToken=$accessToken', async ({ accessToken, expectedHeaders }) => {
162
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
163
+ mockAxios.mockResolvedValue({
164
+ data: {
165
+ builds: [
166
+ {
167
+ buildId: 'id1',
168
+ status: sabs_types_1.BuildStatus.SUCCESS,
169
+ created: new Date('2023-01-01'),
170
+ updated: new Date('2023-01-02')
171
+ },
172
+ {
173
+ buildId: 'id2',
174
+ status: sabs_types_1.BuildStatus.RUNNING,
175
+ created: new Date('2023-01-03'),
176
+ updated: new Date('2023-01-04')
177
+ },
178
+ {
179
+ buildId: 'id3',
180
+ status: sabs_types_1.BuildStatus.FAILED,
181
+ error: 'Build failed',
182
+ created: new Date('2023-01-05'),
183
+ updated: new Date('2023-01-06')
184
+ }
185
+ ]
186
+ }
187
+ });
188
+ const anyOrganizationId = 'anyOrganizationId';
189
+ const anyApplicationId = 'anyApplicationId';
190
+ const anyDirectoryHash = 'anyDirectoryHash';
191
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
192
+ const result = await sabs.list({
193
+ organizationId: anyOrganizationId,
194
+ applicationId: anyApplicationId,
195
+ directoryHash: anyDirectoryHash,
196
+ accessToken
197
+ });
198
+ expect(result).toEqual({
199
+ builds: [
200
+ {
201
+ buildId: 'id1',
202
+ status: sabs_types_1.BuildStatus.SUCCESS,
203
+ created: new Date('2023-01-01'),
204
+ updated: new Date('2023-01-02')
205
+ },
206
+ {
207
+ buildId: 'id2',
208
+ status: sabs_types_1.BuildStatus.RUNNING,
209
+ created: new Date('2023-01-03'),
210
+ updated: new Date('2023-01-04')
211
+ },
212
+ {
213
+ buildId: 'id3',
214
+ status: sabs_types_1.BuildStatus.FAILED,
215
+ error: 'Build failed',
216
+ created: new Date('2023-01-05'),
217
+ updated: new Date('2023-01-06')
218
+ }
219
+ ]
220
+ });
221
+ expect(mockAxios).toHaveBeenCalledWith({
222
+ method: 'GET',
223
+ url: `http://localhost:3000/v1/build`,
224
+ headers: expectedHeaders,
225
+ params: {
226
+ organizationId: anyOrganizationId,
227
+ applicationId: anyApplicationId,
228
+ directoryHash: anyDirectoryHash
229
+ }
230
+ });
231
+ });
232
+ test('raises error when request fails', async () => {
233
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
234
+ mockAxios.mockRejectedValue(new Error('any error'));
235
+ const anyOrganizationId = 'anyOrganizationId';
236
+ const anyApplicationId = 'anyApplicationId';
237
+ const anyDirectoryHash = 'anyDirectoryHash';
238
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
239
+ await expect(sabs.list({
240
+ organizationId: anyOrganizationId,
241
+ applicationId: anyApplicationId,
242
+ directoryHash: anyDirectoryHash
243
+ })).rejects.toThrow();
244
+ expect(mockAxios).toHaveBeenCalledWith({
245
+ method: 'GET',
246
+ url: `http://localhost:3000/v1/build`,
247
+ headers: undefined,
248
+ params: {
249
+ organizationId: anyOrganizationId,
250
+ applicationId: anyApplicationId,
251
+ directoryHash: anyDirectoryHash
252
+ }
253
+ });
254
+ });
255
+ });
256
+ describe('terminate', () => {
257
+ test.each([
258
+ { accessToken: 'anyScopedJwt', expectedHeaders: { Authorization: 'Bearer anyScopedJwt' } },
259
+ { accessToken: undefined, expectedHeaders: undefined }
260
+ ])('returns expected response with accessToken=$accessToken', async ({ accessToken, expectedHeaders }) => {
261
+ const expectedBuildId = 'expectedBuildId';
262
+ const expectedStatus = sabs_types_1.BuildStatus.TIMED_OUT;
263
+ const expectedError = 'build timed out';
264
+ const expectedCreated = new Date();
265
+ const expectedUpdated = new Date();
266
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
267
+ mockAxios.mockResolvedValue({
268
+ data: {
269
+ buildId: expectedBuildId,
270
+ status: expectedStatus,
271
+ error: expectedError,
272
+ created: expectedCreated,
273
+ updated: expectedUpdated
274
+ }
275
+ });
276
+ const anyBuildId = 'anyBuildId';
277
+ const anyStatus = sabs_types_1.BuildStatus.TIMED_OUT;
278
+ const anyError = 'build timed out';
279
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
280
+ const result = await sabs.terminate({ buildId: anyBuildId, status: anyStatus, buildKey: anyBuildKey, error: anyError, accessToken });
281
+ expect(result).toEqual({
282
+ buildId: expectedBuildId,
283
+ status: expectedStatus,
284
+ error: expectedError,
285
+ created: expectedCreated,
286
+ updated: expectedUpdated
287
+ });
288
+ expect(mockAxios).toHaveBeenCalledWith({
289
+ method: 'POST',
290
+ url: `http://localhost:3000/v1/builds/${anyBuildId}/terminate`,
291
+ headers: expectedHeaders,
292
+ data: {
293
+ buildId: anyBuildId,
294
+ status: anyStatus,
295
+ error: anyError,
296
+ buildKey: anyBuildKey
297
+ }
298
+ });
299
+ });
300
+ test('raises error when request fails', async () => {
301
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
302
+ mockAxios.mockRejectedValue(new Error('any error'));
303
+ const anyBuildId = 'anyBuildId';
304
+ const anyStatus = sabs_types_1.BuildStatus.TIMED_OUT;
305
+ const anyError = 'build timed out';
306
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
307
+ await expect(sabs.terminate({ buildId: anyBuildId, status: anyStatus, buildKey: anyBuildKey, error: anyError })).rejects.toThrow();
308
+ expect(mockAxios).toHaveBeenCalledWith({
309
+ method: 'POST',
310
+ url: `http://localhost:3000/v1/builds/${anyBuildId}/terminate`,
311
+ data: {
312
+ buildId: anyBuildId,
313
+ status: anyStatus,
314
+ error: anyError,
315
+ buildKey: anyBuildKey
316
+ }
317
+ });
318
+ });
319
+ });
320
+ describe('bulkStatus', () => {
321
+ test('returns expected response', async () => {
322
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
323
+ mockAxios.mockResolvedValue({
324
+ data: {
325
+ builds: [
326
+ {
327
+ buildId: 'build1',
328
+ status: sabs_types_1.BuildStatus.SUCCESS,
329
+ created: new Date('2023-01-01'),
330
+ updated: new Date('2023-01-02')
331
+ },
332
+ {
333
+ buildId: 'build2',
334
+ status: sabs_types_1.BuildStatus.RUNNING,
335
+ created: new Date('2023-01-03'),
336
+ updated: new Date('2023-01-04')
337
+ }
338
+ ]
339
+ }
340
+ });
341
+ const anyOrganizationId = 'anyOrganizationId';
342
+ const anyApplicationId = 'anyApplicationId';
343
+ const anyDirectoryHashes = ['hash1', 'hash2'];
344
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
345
+ const result = await sabs.bulkStatus({
346
+ organizationId: anyOrganizationId,
347
+ applicationId: anyApplicationId,
348
+ directoryHashes: anyDirectoryHashes
349
+ });
350
+ expect(result).toEqual({
351
+ builds: [
352
+ {
353
+ buildId: 'build1',
354
+ status: sabs_types_1.BuildStatus.SUCCESS,
355
+ created: new Date('2023-01-01'),
356
+ updated: new Date('2023-01-02')
357
+ },
358
+ {
359
+ buildId: 'build2',
360
+ status: sabs_types_1.BuildStatus.RUNNING,
361
+ created: new Date('2023-01-03'),
362
+ updated: new Date('2023-01-04')
363
+ }
364
+ ]
365
+ });
366
+ expect(mockAxios).toHaveBeenCalledWith({
367
+ method: 'POST',
368
+ url: `http://localhost:3000/v1/builds/${anyOrganizationId}/${anyApplicationId}/bulk-status`,
369
+ data: {
370
+ organizationId: anyOrganizationId,
371
+ applicationId: anyApplicationId,
372
+ directoryHashes: anyDirectoryHashes
373
+ }
374
+ });
375
+ });
376
+ });
377
+ describe('executeRequest', () => {
378
+ test('raies expected error when error is axios error', async () => {
379
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
380
+ mockAxios.mockRejectedValue(new axios_1.AxiosError('request failed', 'internal', undefined, undefined, {
381
+ headers: {},
382
+ config: {
383
+ headers: new axios_1.AxiosHeaders()
384
+ },
385
+ status: 500,
386
+ statusText: 'internal server error',
387
+ data: 'failed to process request'
388
+ }));
389
+ const anyBuildId = 'anyBuildId';
390
+ const expectedError = 'sabs service request failed: request failed\n[500] internal server error: "failed to process request"';
391
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
392
+ await expect(sabs.status({ buildId: anyBuildId })).rejects.toThrow(expectedError);
393
+ });
394
+ test('re-raises error when error is not axios error', async () => {
395
+ const mockAxios = jest.spyOn(axios_1.default, 'request');
396
+ mockAxios.mockRejectedValue(new Error('unexpected error'));
397
+ const anyBuildId = 'anyBuildId';
398
+ const expectedError = 'sabs service request failed: unexpected error';
399
+ const sabs = new sabs_1.SabsClient('http://localhost:3000');
400
+ await expect(sabs.status({ buildId: anyBuildId })).rejects.toThrow(expectedError);
401
+ });
402
+ });
403
+ });
404
+ //# sourceMappingURL=sabs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sabs.test.js","sourceRoot":"","sources":["../src/sabs.test.ts"],"names":[],"mappings":"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"}