@vybit/api-sdk 1.0.1 → 1.1.1
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.
- package/README.md +293 -38
- package/dist/__tests__/api-client.test.d.ts +8 -0
- package/dist/__tests__/api-client.test.d.ts.map +1 -0
- package/dist/__tests__/api-client.test.js +324 -0
- package/dist/__tests__/api-client.test.js.map +1 -0
- package/dist/__tests__/api-integration.test.d.ts +11 -0
- package/dist/__tests__/api-integration.test.d.ts.map +1 -0
- package/dist/__tests__/api-integration.test.js +267 -0
- package/dist/__tests__/api-integration.test.js.map +1 -0
- package/dist/api-client.d.ts +265 -9
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +428 -13
- package/dist/api-client.js.map +1 -1
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -8
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +405 -3
- package/dist/types.d.ts.map +1 -1
- package/package.json +18 -7
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* API Client Unit Tests
|
|
4
|
+
*
|
|
5
|
+
* Tests VybitAPIClient methods with mocked fetch.
|
|
6
|
+
* These tests run in CI without requiring an API key.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const api_client_1 = require("../api-client");
|
|
10
|
+
const core_1 = require("@vybit/core");
|
|
11
|
+
// Mock fetch globally
|
|
12
|
+
global.fetch = jest.fn();
|
|
13
|
+
describe('VybitAPIClient Unit Tests', () => {
|
|
14
|
+
let client;
|
|
15
|
+
const mockFetch = global.fetch;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
jest.clearAllMocks();
|
|
18
|
+
client = new api_client_1.VybitAPIClient({ apiKey: 'test-api-key' });
|
|
19
|
+
});
|
|
20
|
+
describe('constructor', () => {
|
|
21
|
+
test('should use provided API key', () => {
|
|
22
|
+
const testClient = new api_client_1.VybitAPIClient({ apiKey: 'custom-key' });
|
|
23
|
+
expect(testClient).toBeDefined();
|
|
24
|
+
});
|
|
25
|
+
test('should fall back to environment variable', () => {
|
|
26
|
+
process.env.VYBIT_API_KEY = 'env-key';
|
|
27
|
+
const testClient = new api_client_1.VybitAPIClient();
|
|
28
|
+
expect(testClient).toBeDefined();
|
|
29
|
+
delete process.env.VYBIT_API_KEY;
|
|
30
|
+
});
|
|
31
|
+
test('should use custom baseUrl when provided', () => {
|
|
32
|
+
const testClient = new api_client_1.VybitAPIClient({
|
|
33
|
+
apiKey: 'test-key',
|
|
34
|
+
baseUrl: 'https://custom.api.com/v1',
|
|
35
|
+
});
|
|
36
|
+
expect(testClient).toBeDefined();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
describe('getStatus', () => {
|
|
40
|
+
test('should return status response', async () => {
|
|
41
|
+
mockFetch.mockResolvedValueOnce({
|
|
42
|
+
ok: true,
|
|
43
|
+
status: 200,
|
|
44
|
+
json: async () => ({ status: 'up' }),
|
|
45
|
+
});
|
|
46
|
+
const result = await client.getStatus();
|
|
47
|
+
expect(result).toEqual({ status: 'up' });
|
|
48
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/status', expect.objectContaining({
|
|
49
|
+
headers: expect.objectContaining({
|
|
50
|
+
'X-API-Key': 'test-api-key',
|
|
51
|
+
}),
|
|
52
|
+
}));
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('getProfile', () => {
|
|
56
|
+
test('should return user profile', async () => {
|
|
57
|
+
const mockProfile = {
|
|
58
|
+
key: 'user123',
|
|
59
|
+
name: 'Test User',
|
|
60
|
+
email: 'test@example.com',
|
|
61
|
+
tier_id: 1,
|
|
62
|
+
};
|
|
63
|
+
mockFetch.mockResolvedValueOnce({
|
|
64
|
+
ok: true,
|
|
65
|
+
status: 200,
|
|
66
|
+
json: async () => mockProfile,
|
|
67
|
+
});
|
|
68
|
+
const result = await client.getProfile();
|
|
69
|
+
expect(result).toEqual(mockProfile);
|
|
70
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/profile', expect.any(Object));
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe('getMeter', () => {
|
|
74
|
+
test('should return meter with all correct fields', async () => {
|
|
75
|
+
const mockMeter = {
|
|
76
|
+
tier_id: 1,
|
|
77
|
+
cap_vybits: 50,
|
|
78
|
+
cap_daily: 500,
|
|
79
|
+
cap_monthly: 7500,
|
|
80
|
+
number_vybits: 12,
|
|
81
|
+
count_daily: 127,
|
|
82
|
+
count_monthly: 3421,
|
|
83
|
+
monthly_reset_dts: '2025-12-01T00:00:00Z',
|
|
84
|
+
};
|
|
85
|
+
mockFetch.mockResolvedValueOnce({
|
|
86
|
+
ok: true,
|
|
87
|
+
status: 200,
|
|
88
|
+
json: async () => mockMeter,
|
|
89
|
+
});
|
|
90
|
+
const result = await client.getMeter();
|
|
91
|
+
expect(result).toEqual(mockMeter);
|
|
92
|
+
expect(result).toHaveProperty('number_vybits');
|
|
93
|
+
expect(result).toHaveProperty('monthly_reset_dts');
|
|
94
|
+
expect(result).not.toHaveProperty('count_total');
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('listVybits', () => {
|
|
98
|
+
test('should list vybits with default params', async () => {
|
|
99
|
+
const mockVybits = [
|
|
100
|
+
{ key: 'vyb1', name: 'Vybit 1', soundKey: 'sound1', triggerType: 'webhook' },
|
|
101
|
+
{ key: 'vyb2', name: 'Vybit 2', soundKey: 'sound2', triggerType: 'schedule' },
|
|
102
|
+
];
|
|
103
|
+
mockFetch.mockResolvedValueOnce({
|
|
104
|
+
ok: true,
|
|
105
|
+
status: 200,
|
|
106
|
+
json: async () => mockVybits,
|
|
107
|
+
});
|
|
108
|
+
const result = await client.listVybits();
|
|
109
|
+
expect(result).toEqual(mockVybits);
|
|
110
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybits', expect.any(Object));
|
|
111
|
+
});
|
|
112
|
+
test('should include pagination params in URL', async () => {
|
|
113
|
+
mockFetch.mockResolvedValueOnce({
|
|
114
|
+
ok: true,
|
|
115
|
+
status: 200,
|
|
116
|
+
json: async () => [],
|
|
117
|
+
});
|
|
118
|
+
await client.listVybits({ offset: 10, limit: 5, search: 'test' });
|
|
119
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybits?offset=10&limit=5&search=test', expect.any(Object));
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('createVybit', () => {
|
|
123
|
+
test('should create vybit with minimal params (name only)', async () => {
|
|
124
|
+
const mockVybit = {
|
|
125
|
+
key: 'vyb123',
|
|
126
|
+
name: 'Test Vybit',
|
|
127
|
+
soundKey: 'default-sound',
|
|
128
|
+
triggerType: 'webhook',
|
|
129
|
+
};
|
|
130
|
+
mockFetch.mockResolvedValueOnce({
|
|
131
|
+
ok: true,
|
|
132
|
+
status: 200,
|
|
133
|
+
json: async () => mockVybit,
|
|
134
|
+
});
|
|
135
|
+
const result = await client.createVybit({ name: 'Test Vybit' });
|
|
136
|
+
expect(result).toEqual(mockVybit);
|
|
137
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit', expect.objectContaining({
|
|
138
|
+
method: 'POST',
|
|
139
|
+
body: JSON.stringify({ name: 'Test Vybit' }),
|
|
140
|
+
}));
|
|
141
|
+
});
|
|
142
|
+
test('should create vybit with all optional fields', async () => {
|
|
143
|
+
const createParams = {
|
|
144
|
+
name: 'Full Test',
|
|
145
|
+
description: 'Test description',
|
|
146
|
+
soundKey: 'sound123',
|
|
147
|
+
status: 'off',
|
|
148
|
+
triggerType: 'schedule',
|
|
149
|
+
access: 'public',
|
|
150
|
+
message: 'Test message',
|
|
151
|
+
};
|
|
152
|
+
mockFetch.mockResolvedValueOnce({
|
|
153
|
+
ok: true,
|
|
154
|
+
status: 200,
|
|
155
|
+
json: async () => ({ ...createParams, key: 'vyb456' }),
|
|
156
|
+
});
|
|
157
|
+
await client.createVybit(createParams);
|
|
158
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit', expect.objectContaining({
|
|
159
|
+
body: JSON.stringify(createParams),
|
|
160
|
+
}));
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
describe('patchVybit', () => {
|
|
164
|
+
test('should update vybit with status field', async () => {
|
|
165
|
+
const mockVybit = {
|
|
166
|
+
key: 'vyb123',
|
|
167
|
+
name: 'Test',
|
|
168
|
+
status: 'off',
|
|
169
|
+
soundKey: 'sound1',
|
|
170
|
+
triggerType: 'webhook',
|
|
171
|
+
};
|
|
172
|
+
mockFetch.mockResolvedValueOnce({
|
|
173
|
+
ok: true,
|
|
174
|
+
status: 200,
|
|
175
|
+
json: async () => mockVybit,
|
|
176
|
+
});
|
|
177
|
+
const result = await client.patchVybit('vyb123', { status: 'off' });
|
|
178
|
+
expect(result.status).toBe('off');
|
|
179
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit/vyb123', expect.objectContaining({
|
|
180
|
+
method: 'PATCH',
|
|
181
|
+
body: JSON.stringify({ status: 'off' }),
|
|
182
|
+
}));
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('listVybitFollows', () => {
|
|
186
|
+
test('should return follows with followingKey field', async () => {
|
|
187
|
+
const mockFollows = [
|
|
188
|
+
{
|
|
189
|
+
followingKey: 'follow123',
|
|
190
|
+
vybName: 'Test Vybit',
|
|
191
|
+
status: 'on',
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
mockFetch.mockResolvedValueOnce({
|
|
195
|
+
ok: true,
|
|
196
|
+
status: 200,
|
|
197
|
+
json: async () => mockFollows,
|
|
198
|
+
});
|
|
199
|
+
const result = await client.listVybitFollows();
|
|
200
|
+
expect(result[0]).toHaveProperty('followingKey');
|
|
201
|
+
expect(result[0]).not.toHaveProperty('key');
|
|
202
|
+
expect(result[0]).not.toHaveProperty('personKey');
|
|
203
|
+
expect(result[0]).not.toHaveProperty('vybKey');
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('searchSounds', () => {
|
|
207
|
+
test('should search sounds with params', async () => {
|
|
208
|
+
const mockSounds = [
|
|
209
|
+
{
|
|
210
|
+
key: 'sound1',
|
|
211
|
+
name: 'Bell',
|
|
212
|
+
type: 'mp3',
|
|
213
|
+
status: 'public',
|
|
214
|
+
url: 'https://api.vybit.net/v1/sound/sound1/play',
|
|
215
|
+
},
|
|
216
|
+
];
|
|
217
|
+
mockFetch.mockResolvedValueOnce({
|
|
218
|
+
ok: true,
|
|
219
|
+
status: 200,
|
|
220
|
+
json: async () => mockSounds,
|
|
221
|
+
});
|
|
222
|
+
const result = await client.searchSounds({ search: 'bell', limit: 10 });
|
|
223
|
+
expect(result).toEqual(mockSounds);
|
|
224
|
+
const callUrl = mockFetch.mock.calls[0][0];
|
|
225
|
+
expect(callUrl).toContain('/v1/sounds?');
|
|
226
|
+
expect(callUrl).toContain('search=bell');
|
|
227
|
+
expect(callUrl).toContain('limit=10');
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
describe('triggerVybit', () => {
|
|
231
|
+
test('should trigger vybit without params', async () => {
|
|
232
|
+
const mockResponse = { result: 1, plk: 'log123' };
|
|
233
|
+
mockFetch.mockResolvedValueOnce({
|
|
234
|
+
ok: true,
|
|
235
|
+
status: 200,
|
|
236
|
+
json: async () => mockResponse,
|
|
237
|
+
});
|
|
238
|
+
const result = await client.triggerVybit('vyb123');
|
|
239
|
+
expect(result).toEqual(mockResponse);
|
|
240
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit/vyb123/trigger', expect.objectContaining({
|
|
241
|
+
method: 'POST',
|
|
242
|
+
}));
|
|
243
|
+
});
|
|
244
|
+
test('should trigger vybit with custom params', async () => {
|
|
245
|
+
const mockResponse = { result: 1, plk: 'log456' };
|
|
246
|
+
const params = {
|
|
247
|
+
message: 'Custom message',
|
|
248
|
+
imageUrl: 'https://example.com/image.jpg',
|
|
249
|
+
linkUrl: 'https://example.com',
|
|
250
|
+
};
|
|
251
|
+
mockFetch.mockResolvedValueOnce({
|
|
252
|
+
ok: true,
|
|
253
|
+
status: 200,
|
|
254
|
+
json: async () => mockResponse,
|
|
255
|
+
});
|
|
256
|
+
const result = await client.triggerVybit('vyb123', params);
|
|
257
|
+
expect(result).toEqual(mockResponse);
|
|
258
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit/vyb123/trigger', expect.objectContaining({
|
|
259
|
+
method: 'POST',
|
|
260
|
+
body: JSON.stringify(params),
|
|
261
|
+
}));
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
describe('error handling', () => {
|
|
265
|
+
test('should throw VybitAuthError on 401', async () => {
|
|
266
|
+
mockFetch.mockResolvedValueOnce({
|
|
267
|
+
ok: false,
|
|
268
|
+
status: 401,
|
|
269
|
+
json: async () => ({ error: 'unauthorized', message: 'Invalid API key' }),
|
|
270
|
+
});
|
|
271
|
+
await expect(client.getStatus()).rejects.toThrow(core_1.VybitAuthError);
|
|
272
|
+
});
|
|
273
|
+
test('should throw VybitAPIError on 404', async () => {
|
|
274
|
+
mockFetch.mockResolvedValueOnce({
|
|
275
|
+
ok: false,
|
|
276
|
+
status: 404,
|
|
277
|
+
json: async () => ({ error: 'not_found', message: 'Resource not found' }),
|
|
278
|
+
});
|
|
279
|
+
await expect(client.getVybit('invalid-key')).rejects.toThrow(core_1.VybitAPIError);
|
|
280
|
+
});
|
|
281
|
+
test('should throw VybitAPIError on 429 (rate limit)', async () => {
|
|
282
|
+
mockFetch.mockResolvedValueOnce({
|
|
283
|
+
ok: false,
|
|
284
|
+
status: 429,
|
|
285
|
+
json: async () => ({ error: 'rate_limit_exceeded', message: 'Too many requests' }),
|
|
286
|
+
});
|
|
287
|
+
await expect(client.getStatus()).rejects.toThrow(core_1.VybitAPIError);
|
|
288
|
+
});
|
|
289
|
+
test('should include status code in error', async () => {
|
|
290
|
+
mockFetch.mockResolvedValueOnce({
|
|
291
|
+
ok: false,
|
|
292
|
+
status: 403,
|
|
293
|
+
json: async () => ({ error: 'forbidden', message: 'Access denied' }),
|
|
294
|
+
});
|
|
295
|
+
try {
|
|
296
|
+
await client.getStatus();
|
|
297
|
+
fail('Should have thrown error');
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
expect(error).toBeInstanceOf(core_1.VybitAPIError);
|
|
301
|
+
expect(error.statusCode).toBe(403);
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
test('should handle network errors', async () => {
|
|
305
|
+
mockFetch.mockRejectedValueOnce(new Error('Network error'));
|
|
306
|
+
await expect(client.getStatus()).rejects.toThrow('Network error');
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe('deleteVybit', () => {
|
|
310
|
+
test('should delete vybit successfully', async () => {
|
|
311
|
+
mockFetch.mockResolvedValueOnce({
|
|
312
|
+
ok: true,
|
|
313
|
+
status: 200,
|
|
314
|
+
json: async () => ({ result: 1, message: 'Deleted successfully' }),
|
|
315
|
+
});
|
|
316
|
+
const result = await client.deleteVybit('vyb123');
|
|
317
|
+
expect(result.result).toBe(1);
|
|
318
|
+
expect(mockFetch).toHaveBeenCalledWith('https://api.vybit.net/v1/vybit/vyb123', expect.objectContaining({
|
|
319
|
+
method: 'DELETE',
|
|
320
|
+
}));
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
//# sourceMappingURL=api-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.test.js","sourceRoot":"","sources":["../../src/__tests__/api-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Client Integration Tests
|
|
3
|
+
*
|
|
4
|
+
* These tests run against the real Vybit API when VYBIT_API_KEY is provided.
|
|
5
|
+
* They are skipped in CI when no API key is available.
|
|
6
|
+
*
|
|
7
|
+
* To run:
|
|
8
|
+
* VYBIT_API_KEY=your-key npm test -w @vybit/api-sdk
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=api-integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/api-integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* API Client Integration Tests
|
|
4
|
+
*
|
|
5
|
+
* These tests run against the real Vybit API when VYBIT_API_KEY is provided.
|
|
6
|
+
* They are skipped in CI when no API key is available.
|
|
7
|
+
*
|
|
8
|
+
* To run:
|
|
9
|
+
* VYBIT_API_KEY=your-key npm test -w @vybit/api-sdk
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
const api_client_1 = require("../api-client");
|
|
13
|
+
const API_KEY = process.env.VYBIT_API_KEY;
|
|
14
|
+
const hasApiKey = !!API_KEY && API_KEY !== 'your-api-key-here';
|
|
15
|
+
// Skip all integration tests if no API key
|
|
16
|
+
const describeWithApiKey = hasApiKey ? describe : describe.skip;
|
|
17
|
+
describeWithApiKey('API Client Integration Tests (Real API)', () => {
|
|
18
|
+
let client;
|
|
19
|
+
const createdResources = {
|
|
20
|
+
vybits: [],
|
|
21
|
+
follows: [],
|
|
22
|
+
peeps: [],
|
|
23
|
+
};
|
|
24
|
+
// Helper to add delay between API calls to avoid rate limiting
|
|
25
|
+
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
|
26
|
+
beforeAll(() => {
|
|
27
|
+
if (!hasApiKey)
|
|
28
|
+
return;
|
|
29
|
+
const baseUrl = process.env.VYBIT_API_URL || 'https://api.vybit.net/v1';
|
|
30
|
+
client = new api_client_1.VybitAPIClient({
|
|
31
|
+
apiKey: API_KEY,
|
|
32
|
+
baseUrl: baseUrl
|
|
33
|
+
});
|
|
34
|
+
console.log('🔑 Running API integration tests with real API key');
|
|
35
|
+
console.log(`🌐 API URL: ${baseUrl}`);
|
|
36
|
+
console.log('⏱️ Adding delays between requests to avoid rate limiting...');
|
|
37
|
+
});
|
|
38
|
+
beforeEach(async () => {
|
|
39
|
+
// Add 200ms delay before each test to avoid rate limiting (10 req/sec = 100ms minimum)
|
|
40
|
+
await delay(200);
|
|
41
|
+
});
|
|
42
|
+
afterAll(async () => {
|
|
43
|
+
if (!hasApiKey || !client)
|
|
44
|
+
return;
|
|
45
|
+
// Cleanup any created resources
|
|
46
|
+
console.log('🧹 Cleaning up test resources...');
|
|
47
|
+
for (const followKey of createdResources.follows) {
|
|
48
|
+
try {
|
|
49
|
+
await client.deleteVybitFollow(followKey);
|
|
50
|
+
await delay(150);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// Ignore cleanup errors
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const vybitKey of createdResources.vybits) {
|
|
57
|
+
try {
|
|
58
|
+
await client.deleteVybit(vybitKey);
|
|
59
|
+
await delay(150);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
// Ignore cleanup errors
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
describe('Basic Endpoints', () => {
|
|
67
|
+
test('getStatus should return up', async () => {
|
|
68
|
+
const result = await client.getStatus();
|
|
69
|
+
expect(result.status).toBe('up');
|
|
70
|
+
});
|
|
71
|
+
test('getProfile should return user profile', async () => {
|
|
72
|
+
const result = await client.getProfile();
|
|
73
|
+
expect(result).toHaveProperty('key');
|
|
74
|
+
expect(result).toHaveProperty('name');
|
|
75
|
+
expect(result).toHaveProperty('email');
|
|
76
|
+
expect(result).toHaveProperty('tier_id');
|
|
77
|
+
});
|
|
78
|
+
test('getMeter should return correct meter fields', async () => {
|
|
79
|
+
const result = await client.getMeter();
|
|
80
|
+
expect(result).toHaveProperty('tier_id');
|
|
81
|
+
expect(result).toHaveProperty('cap_vybits');
|
|
82
|
+
expect(result).toHaveProperty('cap_daily');
|
|
83
|
+
expect(result).toHaveProperty('cap_monthly');
|
|
84
|
+
expect(result).toHaveProperty('number_vybits');
|
|
85
|
+
expect(result).toHaveProperty('count_daily');
|
|
86
|
+
expect(result).toHaveProperty('count_monthly');
|
|
87
|
+
expect(result).toHaveProperty('monthly_reset_dts');
|
|
88
|
+
// Should NOT have this field
|
|
89
|
+
expect(result).not.toHaveProperty('count_total');
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe('Vybit CRUD Operations', () => {
|
|
93
|
+
test('createVybit with minimal params (name only)', async () => {
|
|
94
|
+
const result = await client.createVybit({
|
|
95
|
+
name: 'API Test - Minimal',
|
|
96
|
+
});
|
|
97
|
+
expect(result).toHaveProperty('key');
|
|
98
|
+
expect(result.name).toBe('API Test - Minimal');
|
|
99
|
+
expect(result).toHaveProperty('soundKey'); // Should have default
|
|
100
|
+
expect(result).toHaveProperty('triggerType'); // Should have default
|
|
101
|
+
expect(result).toHaveProperty('triggerKey');
|
|
102
|
+
expect(result).toHaveProperty('subscriptionKey');
|
|
103
|
+
createdResources.vybits.push(result.key);
|
|
104
|
+
});
|
|
105
|
+
test('createVybit with all optional fields', async () => {
|
|
106
|
+
const result = await client.createVybit({
|
|
107
|
+
name: 'API Test - Full',
|
|
108
|
+
description: 'Test description',
|
|
109
|
+
status: 'off',
|
|
110
|
+
access: 'private',
|
|
111
|
+
message: 'Test message',
|
|
112
|
+
});
|
|
113
|
+
expect(result.name).toBe('API Test - Full');
|
|
114
|
+
expect(result.description).toBe('Test description');
|
|
115
|
+
expect(result.status).toBe('off');
|
|
116
|
+
expect(result.access).toBe('private');
|
|
117
|
+
expect(result.message).toBe('Test message');
|
|
118
|
+
createdResources.vybits.push(result.key);
|
|
119
|
+
});
|
|
120
|
+
test('getVybit should retrieve created vybit', async () => {
|
|
121
|
+
const created = await client.createVybit({ name: 'API Test - Get' });
|
|
122
|
+
createdResources.vybits.push(created.key);
|
|
123
|
+
await delay(150);
|
|
124
|
+
const result = await client.getVybit(created.key);
|
|
125
|
+
expect(result.key).toBe(created.key);
|
|
126
|
+
expect(result.name).toBe('API Test - Get');
|
|
127
|
+
});
|
|
128
|
+
test('patchVybit should update status field', async () => {
|
|
129
|
+
const created = await client.createVybit({ name: 'API Test - Update' });
|
|
130
|
+
createdResources.vybits.push(created.key);
|
|
131
|
+
await delay(150);
|
|
132
|
+
const result = await client.patchVybit(created.key, {
|
|
133
|
+
status: 'off',
|
|
134
|
+
});
|
|
135
|
+
expect(result.status).toBe('off');
|
|
136
|
+
});
|
|
137
|
+
test('patchVybit should update multiple fields', async () => {
|
|
138
|
+
const created = await client.createVybit({ name: 'API Test - Multi' });
|
|
139
|
+
createdResources.vybits.push(created.key);
|
|
140
|
+
await delay(150);
|
|
141
|
+
const result = await client.patchVybit(created.key, {
|
|
142
|
+
name: 'Updated Name',
|
|
143
|
+
status: 'off',
|
|
144
|
+
message: 'Updated message',
|
|
145
|
+
});
|
|
146
|
+
expect(result.name).toBe('Updated Name');
|
|
147
|
+
expect(result.status).toBe('off');
|
|
148
|
+
expect(result.message).toBe('Updated message');
|
|
149
|
+
});
|
|
150
|
+
test('listVybits should return array', async () => {
|
|
151
|
+
const result = await client.listVybits({ limit: 5 });
|
|
152
|
+
expect(Array.isArray(result)).toBe(true);
|
|
153
|
+
expect(result.length).toBeLessThanOrEqual(5);
|
|
154
|
+
});
|
|
155
|
+
test('deleteVybit should remove vybit', async () => {
|
|
156
|
+
const created = await client.createVybit({ name: 'API Test - Delete' });
|
|
157
|
+
await delay(150);
|
|
158
|
+
const result = await client.deleteVybit(created.key);
|
|
159
|
+
expect(result.result).toBe(1);
|
|
160
|
+
// Remove from cleanup list since already deleted
|
|
161
|
+
const index = createdResources.vybits.indexOf(created.key);
|
|
162
|
+
if (index > -1) {
|
|
163
|
+
createdResources.vybits.splice(index, 1);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
describe('Vybit Follows', () => {
|
|
168
|
+
test('listVybitFollows should use followingKey field', async () => {
|
|
169
|
+
const result = await client.listVybitFollows({ limit: 1 });
|
|
170
|
+
if (result.length > 0) {
|
|
171
|
+
expect(result[0]).toHaveProperty('followingKey');
|
|
172
|
+
expect(result[0]).not.toHaveProperty('key');
|
|
173
|
+
expect(result[0]).not.toHaveProperty('personKey');
|
|
174
|
+
expect(result[0]).not.toHaveProperty('vybKey');
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
describe('Sounds', () => {
|
|
179
|
+
test('searchSounds should return results', async () => {
|
|
180
|
+
const result = await client.searchSounds({
|
|
181
|
+
search: 'notification',
|
|
182
|
+
limit: 5,
|
|
183
|
+
});
|
|
184
|
+
expect(Array.isArray(result)).toBe(true);
|
|
185
|
+
if (result.length > 0) {
|
|
186
|
+
expect(result[0]).toHaveProperty('key');
|
|
187
|
+
expect(result[0]).toHaveProperty('name');
|
|
188
|
+
expect(result[0]).toHaveProperty('type');
|
|
189
|
+
expect(result[0]).toHaveProperty('status');
|
|
190
|
+
expect(result[0]).toHaveProperty('url');
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
test('getSound should return sound details', async () => {
|
|
194
|
+
const sounds = await client.searchSounds({ limit: 1 });
|
|
195
|
+
if (sounds.length === 0) {
|
|
196
|
+
console.log('No sounds available, skipping test');
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
await delay(150);
|
|
200
|
+
const result = await client.getSound(sounds[0].key);
|
|
201
|
+
expect(result.key).toBe(sounds[0].key);
|
|
202
|
+
expect(result).toHaveProperty('name');
|
|
203
|
+
expect(result).toHaveProperty('type');
|
|
204
|
+
expect(result).toHaveProperty('url');
|
|
205
|
+
});
|
|
206
|
+
test('getSoundPlayUrl should return correct URL', () => {
|
|
207
|
+
const baseUrl = process.env.VYBIT_API_URL || 'https://api.vybit.net/v1';
|
|
208
|
+
const url = client.getSoundPlayUrl('test-sound-key');
|
|
209
|
+
expect(url).toBe(`${baseUrl}/sound/test-sound-key/play`);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
describe('Vybit Trigger', () => {
|
|
213
|
+
let testVybit;
|
|
214
|
+
beforeAll(async () => {
|
|
215
|
+
if (!hasApiKey)
|
|
216
|
+
return;
|
|
217
|
+
testVybit = await client.createVybit({
|
|
218
|
+
name: 'API Test - Trigger',
|
|
219
|
+
status: 'on',
|
|
220
|
+
});
|
|
221
|
+
createdResources.vybits.push(testVybit.key);
|
|
222
|
+
await delay(200);
|
|
223
|
+
});
|
|
224
|
+
test('triggerVybit without params should work', async () => {
|
|
225
|
+
const result = await client.triggerVybit(testVybit.key);
|
|
226
|
+
expect(result).toHaveProperty('result');
|
|
227
|
+
expect(result.result).toBe(1);
|
|
228
|
+
expect(result).toHaveProperty('plk');
|
|
229
|
+
});
|
|
230
|
+
test('triggerVybit with custom message should work', async () => {
|
|
231
|
+
const result = await client.triggerVybit(testVybit.key, {
|
|
232
|
+
message: 'Integration test notification',
|
|
233
|
+
});
|
|
234
|
+
expect(result.result).toBe(1);
|
|
235
|
+
expect(result).toHaveProperty('plk');
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe('Error Handling', () => {
|
|
239
|
+
test('should throw error for non-existent vybit', async () => {
|
|
240
|
+
await expect(client.getVybit('invalid-key-12345')).rejects.toThrow();
|
|
241
|
+
});
|
|
242
|
+
test('should throw error for non-existent sound', async () => {
|
|
243
|
+
await expect(client.getSound('invalid-sound-key')).rejects.toThrow();
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('Logs', () => {
|
|
247
|
+
test('listLogs should return array', async () => {
|
|
248
|
+
const result = await client.listLogs({ limit: 5 });
|
|
249
|
+
expect(Array.isArray(result)).toBe(true);
|
|
250
|
+
if (result.length > 0) {
|
|
251
|
+
expect(result[0]).toHaveProperty('key');
|
|
252
|
+
expect(result[0]).toHaveProperty('vybKey');
|
|
253
|
+
expect(result[0]).toHaveProperty('ownerName');
|
|
254
|
+
expect(result[0]).toHaveProperty('senderName');
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
// Show message when tests are skipped
|
|
260
|
+
if (!hasApiKey) {
|
|
261
|
+
describe('API Client Integration Tests', () => {
|
|
262
|
+
test.skip('Integration tests skipped - set VYBIT_API_KEY to run', () => {
|
|
263
|
+
console.log('💡 Tip: Run with VYBIT_API_KEY=your-key npm test -w @vybit/api-sdk');
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=api-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-integration.test.js","sourceRoot":"","sources":["../../src/__tests__/api-integration.test.ts"],"names":[],"mappings":"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"}
|