@smess/networking 1.0.9 → 1.0.12
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 +26 -20
- package/dist/core/axios.d.ts +3 -3
- package/dist/core/axios.js +2 -2
- package/dist/core/axios.observable.d.ts +3 -3
- package/dist/core/axios.observable.js +7 -7
- package/dist/core/base.provider.advanced.test.js +15 -15
- package/dist/core/base.provider.d.ts +1 -1
- package/dist/core/base.provider.js +2 -2
- package/dist/core/base.provider.test.js +22 -18
- package/dist/core/base.service.wrapper.advanced.test.js +16 -13
- package/dist/core/base.service.wrapper.d.ts +2 -2
- package/dist/core/base.service.wrapper.js +1 -1
- package/dist/core/base.service.wrapper.test.js +14 -14
- package/dist/core/rx.http.service.d.ts +3 -3
- package/dist/core/rx.http.service.js +2 -2
- package/dist/index.d.ts +13 -13
- package/dist/index.js +15 -15
- package/dist/services/auth.service.d.ts +6 -5
- package/dist/services/auth.service.js +50 -28
- package/dist/services/auth.service.test.js +67 -51
- package/dist/services/cache.service.d.ts +1 -1
- package/dist/services/cache.service.js +7 -7
- package/dist/services/cache.service.test.d.ts +1 -1
- package/dist/services/cache.service.test.js +37 -37
- package/dist/services/customer.service.d.ts +4 -4
- package/dist/services/customer.service.js +19 -17
- package/dist/services/customer.service.test.js +38 -34
- package/dist/services/logger.service.js +11 -11
- package/dist/services/logger.service.test.js +12 -12
- package/dist/services/order.service.d.ts +5 -4
- package/dist/services/order.service.js +32 -30
- package/dist/services/order.service.test.js +47 -47
- package/dist/services/product.service.d.ts +4 -4
- package/dist/services/product.service.js +8 -8
- package/dist/services/product.service.test.js +27 -19
- package/dist/services/smess.service.d.ts +2 -2
- package/dist/services/smess.service.js +19 -19
- package/dist/services/smess.service.test.js +36 -32
- package/dist/services/store.service.d.ts +4 -4
- package/dist/services/store.service.js +70 -50
- package/dist/services/store.service.test.d.ts +1 -1
- package/dist/services/store.service.test.js +161 -85
- package/dist/services/user.service.d.ts +3 -3
- package/dist/services/user.service.js +11 -8
- package/dist/services/user.service.test.js +23 -17
- package/dist/types/types.js +3 -3
- package/dist/types/types.test.js +8 -8
- package/dist/utils/cache-import.d.ts +1 -1
- package/dist/utils/cache-import.js +1 -1
- package/dist/utils/networking-import.d.ts +3 -3
- package/dist/utils/networking-import.js +2 -2
- package/dist/utils/rxjs-import.d.ts +2 -2
- package/dist/utils/rxjs-import.js +2 -2
- package/package.json +1 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { StoreService } from
|
|
3
|
-
import { NetworkingUIEventWrapped, AlertModel } from
|
|
4
|
-
import { of, BehaviorSubject } from
|
|
5
|
-
describe(
|
|
1
|
+
import "fake-indexeddb/auto";
|
|
2
|
+
import { StoreService, } from "./store.service";
|
|
3
|
+
import { NetworkingUIEventWrapped, AlertModel, } from "../types/types";
|
|
4
|
+
import { of, BehaviorSubject } from "rxjs";
|
|
5
|
+
describe("StoreService", () => {
|
|
6
6
|
const config = {
|
|
7
|
-
baseUrl:
|
|
7
|
+
baseUrl: "https://api.example.com",
|
|
8
8
|
isProd: false,
|
|
9
|
-
clientId:
|
|
10
|
-
apiKey:
|
|
9
|
+
clientId: "test-client-id",
|
|
10
|
+
apiKey: "test-api-key",
|
|
11
11
|
};
|
|
12
12
|
let service;
|
|
13
13
|
let $authToken;
|
|
@@ -18,182 +18,258 @@ describe('StoreService', () => {
|
|
|
18
18
|
afterEach(async () => {
|
|
19
19
|
await service.clearCache();
|
|
20
20
|
});
|
|
21
|
-
it(
|
|
21
|
+
it("should create service instance", () => {
|
|
22
22
|
expect(service).toBeDefined();
|
|
23
23
|
});
|
|
24
|
-
it(
|
|
25
|
-
const response = { data: { id:
|
|
24
|
+
it("should get store from network when no cache", async () => {
|
|
25
|
+
const response = { data: { id: "1", name: "Store" } };
|
|
26
26
|
const mockProvider = {
|
|
27
|
-
request: jest
|
|
27
|
+
request: jest
|
|
28
|
+
.fn()
|
|
29
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
28
30
|
};
|
|
29
|
-
jest
|
|
30
|
-
|
|
31
|
+
jest
|
|
32
|
+
.spyOn(service, "provider")
|
|
33
|
+
.mockReturnValue(mockProvider);
|
|
34
|
+
const result = await service.get("1").toPromise();
|
|
31
35
|
expect(result?.hasSuccess).toBe(true);
|
|
32
36
|
expect(result?.response).toEqual(response);
|
|
33
37
|
});
|
|
34
|
-
it(
|
|
35
|
-
const response = { data: { id:
|
|
38
|
+
it("should get store from cache when available", async () => {
|
|
39
|
+
const response = { data: { id: "1", name: "Store" } };
|
|
36
40
|
// First call to populate cache
|
|
37
41
|
const mockProvider1 = {
|
|
38
|
-
request: jest
|
|
42
|
+
request: jest
|
|
43
|
+
.fn()
|
|
44
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
39
45
|
};
|
|
40
|
-
jest
|
|
41
|
-
|
|
46
|
+
jest
|
|
47
|
+
.spyOn(service, "provider")
|
|
48
|
+
.mockReturnValue(mockProvider1);
|
|
49
|
+
await service.get("1").toPromise();
|
|
42
50
|
// Second call should use cache (even if network fails)
|
|
43
51
|
const mockProvider2 = {
|
|
44
|
-
request: jest
|
|
52
|
+
request: jest
|
|
53
|
+
.fn()
|
|
54
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
45
55
|
};
|
|
46
|
-
jest
|
|
47
|
-
|
|
56
|
+
jest
|
|
57
|
+
.spyOn(service, "provider")
|
|
58
|
+
.mockReturnValue(mockProvider2);
|
|
59
|
+
const result = await service.get("1").toPromise();
|
|
48
60
|
expect(result?.hasSuccess).toBe(true);
|
|
49
61
|
expect(result?.response).toEqual(response);
|
|
50
62
|
});
|
|
51
|
-
it(
|
|
63
|
+
it("should handle network error when no cache", async () => {
|
|
52
64
|
const mockProvider = {
|
|
53
|
-
request: jest
|
|
65
|
+
request: jest
|
|
66
|
+
.fn()
|
|
67
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
54
68
|
};
|
|
55
|
-
jest
|
|
56
|
-
|
|
69
|
+
jest
|
|
70
|
+
.spyOn(service, "provider")
|
|
71
|
+
.mockReturnValue(mockProvider);
|
|
72
|
+
const result = await service.get("1").toPromise();
|
|
57
73
|
expect(result?.hasFailed).toBe(true);
|
|
58
74
|
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
59
75
|
});
|
|
60
|
-
it(
|
|
61
|
-
const response = { data: [{ id:
|
|
76
|
+
it("should get store list from network when no cache", async () => {
|
|
77
|
+
const response = { data: [{ id: "1", name: "Store" }] };
|
|
62
78
|
const mockProvider = {
|
|
63
|
-
request: jest
|
|
79
|
+
request: jest
|
|
80
|
+
.fn()
|
|
81
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
64
82
|
};
|
|
65
|
-
jest
|
|
83
|
+
jest
|
|
84
|
+
.spyOn(service, "provider")
|
|
85
|
+
.mockReturnValue(mockProvider);
|
|
66
86
|
const result = await service.list().toPromise();
|
|
67
87
|
expect(result?.hasSuccess).toBe(true);
|
|
68
88
|
expect(result?.response).toEqual(response);
|
|
69
89
|
});
|
|
70
|
-
it(
|
|
71
|
-
const response = { data: [{ id:
|
|
90
|
+
it("should get store list from cache when available", async () => {
|
|
91
|
+
const response = { data: [{ id: "1", name: "Store" }] };
|
|
72
92
|
// First call to populate cache
|
|
73
93
|
const mockProvider1 = {
|
|
74
|
-
request: jest
|
|
94
|
+
request: jest
|
|
95
|
+
.fn()
|
|
96
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
75
97
|
};
|
|
76
|
-
jest
|
|
98
|
+
jest
|
|
99
|
+
.spyOn(service, "provider")
|
|
100
|
+
.mockReturnValue(mockProvider1);
|
|
77
101
|
await service.list().toPromise();
|
|
78
102
|
// Second call should use cache
|
|
79
103
|
const mockProvider2 = {
|
|
80
|
-
request: jest
|
|
104
|
+
request: jest
|
|
105
|
+
.fn()
|
|
106
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
81
107
|
};
|
|
82
|
-
jest
|
|
108
|
+
jest
|
|
109
|
+
.spyOn(service, "provider")
|
|
110
|
+
.mockReturnValue(mockProvider2);
|
|
83
111
|
const result = await service.list().toPromise();
|
|
84
112
|
expect(result?.hasSuccess).toBe(true);
|
|
85
113
|
expect(result?.response).toEqual(response);
|
|
86
114
|
});
|
|
87
|
-
it(
|
|
88
|
-
const response = { data: [{ id:
|
|
115
|
+
it("should get product category list from network when no cache", async () => {
|
|
116
|
+
const response = { data: [{ id: "cat1", name: "Category" }] };
|
|
89
117
|
const mockProvider = {
|
|
90
|
-
request: jest
|
|
118
|
+
request: jest
|
|
119
|
+
.fn()
|
|
120
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
91
121
|
};
|
|
92
|
-
jest
|
|
122
|
+
jest
|
|
123
|
+
.spyOn(service, "provider")
|
|
124
|
+
.mockReturnValue(mockProvider);
|
|
93
125
|
const result = await service.productCategoryList().toPromise();
|
|
94
126
|
expect(result?.hasSuccess).toBe(true);
|
|
95
127
|
expect(result?.response).toEqual(response);
|
|
96
128
|
});
|
|
97
|
-
it(
|
|
98
|
-
const response = { data: [{ id:
|
|
129
|
+
it("should get product category list from cache when available", async () => {
|
|
130
|
+
const response = { data: [{ id: "cat1", name: "Category" }] };
|
|
99
131
|
// First call to populate cache
|
|
100
132
|
const mockProvider1 = {
|
|
101
|
-
request: jest
|
|
133
|
+
request: jest
|
|
134
|
+
.fn()
|
|
135
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
102
136
|
};
|
|
103
|
-
jest
|
|
137
|
+
jest
|
|
138
|
+
.spyOn(service, "provider")
|
|
139
|
+
.mockReturnValue(mockProvider1);
|
|
104
140
|
await service.productCategoryList().toPromise();
|
|
105
141
|
// Second call should use cache
|
|
106
142
|
const mockProvider2 = {
|
|
107
|
-
request: jest
|
|
143
|
+
request: jest
|
|
144
|
+
.fn()
|
|
145
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
108
146
|
};
|
|
109
|
-
jest
|
|
147
|
+
jest
|
|
148
|
+
.spyOn(service, "provider")
|
|
149
|
+
.mockReturnValue(mockProvider2);
|
|
110
150
|
const result = await service.productCategoryList().toPromise();
|
|
111
151
|
expect(result?.hasSuccess).toBe(true);
|
|
112
152
|
expect(result?.response).toEqual(response);
|
|
113
153
|
});
|
|
114
|
-
it(
|
|
115
|
-
const response = { data: [{ id:
|
|
154
|
+
it("should get product collection from network when no cache", async () => {
|
|
155
|
+
const response = { data: [{ id: "prod1", name: "Product" }] };
|
|
116
156
|
const payload = { page: 1, per_page: 10 };
|
|
117
157
|
const mockProvider = {
|
|
118
|
-
request: jest
|
|
158
|
+
request: jest
|
|
159
|
+
.fn()
|
|
160
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
119
161
|
};
|
|
120
|
-
jest
|
|
121
|
-
|
|
162
|
+
jest
|
|
163
|
+
.spyOn(service, "provider")
|
|
164
|
+
.mockReturnValue(mockProvider);
|
|
165
|
+
const result = await service.productCollection("1", payload).toPromise();
|
|
122
166
|
expect(result?.hasSuccess).toBe(true);
|
|
123
167
|
expect(result?.response).toEqual(response);
|
|
124
168
|
});
|
|
125
|
-
it(
|
|
126
|
-
const response = { data: [{ id:
|
|
169
|
+
it("should get product collection from cache when available", async () => {
|
|
170
|
+
const response = { data: [{ id: "prod1", name: "Product" }] };
|
|
127
171
|
const payload = { page: 1, per_page: 10 };
|
|
128
172
|
// First call to populate cache
|
|
129
173
|
const mockProvider1 = {
|
|
130
|
-
request: jest
|
|
174
|
+
request: jest
|
|
175
|
+
.fn()
|
|
176
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
131
177
|
};
|
|
132
|
-
jest
|
|
133
|
-
|
|
178
|
+
jest
|
|
179
|
+
.spyOn(service, "provider")
|
|
180
|
+
.mockReturnValue(mockProvider1);
|
|
181
|
+
await service.productCollection("1", payload).toPromise();
|
|
134
182
|
// Second call should use cache
|
|
135
183
|
const mockProvider2 = {
|
|
136
|
-
request: jest
|
|
184
|
+
request: jest
|
|
185
|
+
.fn()
|
|
186
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
137
187
|
};
|
|
138
|
-
jest
|
|
139
|
-
|
|
188
|
+
jest
|
|
189
|
+
.spyOn(service, "provider")
|
|
190
|
+
.mockReturnValue(mockProvider2);
|
|
191
|
+
const result = await service.productCollection("1", payload).toPromise();
|
|
140
192
|
expect(result?.hasSuccess).toBe(true);
|
|
141
193
|
expect(result?.response).toEqual(response);
|
|
142
194
|
});
|
|
143
|
-
it(
|
|
144
|
-
const response = {
|
|
195
|
+
it("should get featured product list from network when no cache", async () => {
|
|
196
|
+
const response = {
|
|
197
|
+
data: [{ id: "feat1", name: "Featured" }],
|
|
198
|
+
};
|
|
145
199
|
const mockProvider = {
|
|
146
|
-
request: jest
|
|
200
|
+
request: jest
|
|
201
|
+
.fn()
|
|
202
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
147
203
|
};
|
|
148
|
-
jest
|
|
149
|
-
|
|
204
|
+
jest
|
|
205
|
+
.spyOn(service, "provider")
|
|
206
|
+
.mockReturnValue(mockProvider);
|
|
207
|
+
const result = await service.featuredProductList("1").toPromise();
|
|
150
208
|
expect(result?.hasSuccess).toBe(true);
|
|
151
209
|
expect(result?.response).toEqual(response);
|
|
152
210
|
});
|
|
153
|
-
it(
|
|
154
|
-
const response = {
|
|
211
|
+
it("should get featured product list from cache when available", async () => {
|
|
212
|
+
const response = {
|
|
213
|
+
data: [{ id: "feat1", name: "Featured" }],
|
|
214
|
+
};
|
|
155
215
|
// First call to populate cache
|
|
156
216
|
const mockProvider1 = {
|
|
157
|
-
request: jest
|
|
217
|
+
request: jest
|
|
218
|
+
.fn()
|
|
219
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
158
220
|
};
|
|
159
|
-
jest
|
|
160
|
-
|
|
221
|
+
jest
|
|
222
|
+
.spyOn(service, "provider")
|
|
223
|
+
.mockReturnValue(mockProvider1);
|
|
224
|
+
await service.featuredProductList("1").toPromise();
|
|
161
225
|
// Second call should use cache
|
|
162
226
|
const mockProvider2 = {
|
|
163
|
-
request: jest
|
|
227
|
+
request: jest
|
|
228
|
+
.fn()
|
|
229
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(AlertModel.default()))),
|
|
164
230
|
};
|
|
165
|
-
jest
|
|
166
|
-
|
|
231
|
+
jest
|
|
232
|
+
.spyOn(service, "provider")
|
|
233
|
+
.mockReturnValue(mockProvider2);
|
|
234
|
+
const result = await service.featuredProductList("1").toPromise();
|
|
167
235
|
expect(result?.hasSuccess).toBe(true);
|
|
168
236
|
expect(result?.response).toEqual(response);
|
|
169
237
|
});
|
|
170
|
-
it(
|
|
171
|
-
const response = { data: { id:
|
|
238
|
+
it("should clear cache successfully", async () => {
|
|
239
|
+
const response = { data: { id: "1", name: "Store" } };
|
|
172
240
|
const mockProvider = {
|
|
173
|
-
request: jest
|
|
241
|
+
request: jest
|
|
242
|
+
.fn()
|
|
243
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
174
244
|
};
|
|
175
|
-
jest
|
|
245
|
+
jest
|
|
246
|
+
.spyOn(service, "provider")
|
|
247
|
+
.mockReturnValue(mockProvider);
|
|
176
248
|
// Populate cache
|
|
177
|
-
await service.get(
|
|
249
|
+
await service.get("1").toPromise();
|
|
178
250
|
// Clear cache
|
|
179
251
|
await service.clearCache();
|
|
180
252
|
// Should call network again after cache clear
|
|
181
|
-
const result = await service.get(
|
|
253
|
+
const result = await service.get("1").toPromise();
|
|
182
254
|
expect(result?.hasSuccess).toBe(true);
|
|
183
255
|
expect(mockProvider.request).toHaveBeenCalledTimes(2); // Once before clear, once after
|
|
184
256
|
});
|
|
185
|
-
it(
|
|
186
|
-
const response = { data: { id:
|
|
257
|
+
it("should clear specific store cache", async () => {
|
|
258
|
+
const response = { data: { id: "1", name: "Store" } };
|
|
187
259
|
const mockProvider = {
|
|
188
|
-
request: jest
|
|
260
|
+
request: jest
|
|
261
|
+
.fn()
|
|
262
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response))),
|
|
189
263
|
};
|
|
190
|
-
jest
|
|
264
|
+
jest
|
|
265
|
+
.spyOn(service, "provider")
|
|
266
|
+
.mockReturnValue(mockProvider);
|
|
191
267
|
// Populate cache for store '1'
|
|
192
|
-
await service.get(
|
|
268
|
+
await service.get("1").toPromise();
|
|
193
269
|
// Clear specific store cache
|
|
194
|
-
await service.clearStoreCache(
|
|
270
|
+
await service.clearStoreCache("1");
|
|
195
271
|
// Should call network again after cache clear
|
|
196
|
-
const result = await service.get(
|
|
272
|
+
const result = await service.get("1").toPromise();
|
|
197
273
|
expect(result?.hasSuccess).toBe(true);
|
|
198
274
|
expect(mockProvider.request).toHaveBeenCalledTimes(2);
|
|
199
275
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { BaseProvider } from
|
|
2
|
-
import { BaseServiceWrapper } from
|
|
3
|
-
import { NetworkingConfig } from
|
|
1
|
+
import { BaseProvider } from "../core/base.provider";
|
|
2
|
+
import { BaseServiceWrapper } from "../core/base.service.wrapper";
|
|
3
|
+
import { NetworkingConfig } from "../types/types";
|
|
4
4
|
export interface User {
|
|
5
5
|
id: number;
|
|
6
6
|
name: string;
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { BaseProvider } from
|
|
2
|
-
import { BaseServiceWrapper } from
|
|
1
|
+
import { BaseProvider } from "../core/base.provider";
|
|
2
|
+
import { BaseServiceWrapper } from "../core/base.service.wrapper";
|
|
3
3
|
// UserProvider implements ProviderType for user endpoints
|
|
4
4
|
export class UserProvider extends BaseProvider {
|
|
5
5
|
constructor(config, userId) {
|
|
6
6
|
super({
|
|
7
7
|
config,
|
|
8
|
-
path: userId ? `/users/${userId}` :
|
|
9
|
-
method:
|
|
8
|
+
path: userId ? `/users/${userId}` : "/users",
|
|
9
|
+
method: "GET",
|
|
10
10
|
headers: {},
|
|
11
|
-
getPath: () => (userId ? `/users/${userId}` :
|
|
11
|
+
getPath: () => (userId ? `/users/${userId}` : "/users"),
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -19,16 +19,19 @@ export class UserService extends BaseServiceWrapper {
|
|
|
19
19
|
}
|
|
20
20
|
// Fetch a user by ID
|
|
21
21
|
fetchUserById(id) {
|
|
22
|
-
this.provider = new UserProvider({ baseUrl:
|
|
22
|
+
this.provider = new UserProvider({ baseUrl: "https://jsonplaceholder.typicode.com", isProd: false }, id);
|
|
23
23
|
return this.request();
|
|
24
24
|
}
|
|
25
25
|
// Fetch all users
|
|
26
26
|
fetchAllUsers() {
|
|
27
|
-
this.provider = new UserProvider({
|
|
27
|
+
this.provider = new UserProvider({
|
|
28
|
+
baseUrl: "https://jsonplaceholder.typicode.com",
|
|
29
|
+
isProd: false,
|
|
30
|
+
});
|
|
28
31
|
return this.request();
|
|
29
32
|
}
|
|
30
33
|
}
|
|
31
34
|
// Example usage:
|
|
32
35
|
// setNetworkingConfig({ baseUrl: 'https://jsonplaceholder.typicode.com', isProd: false });
|
|
33
36
|
// const userService = new UserService();
|
|
34
|
-
// userService.fetchUserById(1).subscribe(result => console.log(result));
|
|
37
|
+
// userService.fetchUserById(1).subscribe(result => console.log(result));
|
|
@@ -1,44 +1,50 @@
|
|
|
1
|
-
import { UserService } from
|
|
2
|
-
import { NetworkingUIEventWrapped } from
|
|
3
|
-
import { of, throwError } from
|
|
4
|
-
import { BaseServiceWrapper } from
|
|
5
|
-
describe(
|
|
1
|
+
import { UserService } from "./user.service";
|
|
2
|
+
import { NetworkingUIEventWrapped } from "../types/types";
|
|
3
|
+
import { of, throwError } from "rxjs";
|
|
4
|
+
import { BaseServiceWrapper } from "../core/base.service.wrapper";
|
|
5
|
+
describe("UserService", () => {
|
|
6
6
|
const config = {
|
|
7
|
-
baseUrl:
|
|
7
|
+
baseUrl: "https://jsonplaceholder.typicode.com",
|
|
8
8
|
isProd: false,
|
|
9
|
-
clientId:
|
|
10
|
-
apiKey:
|
|
9
|
+
clientId: "test-client",
|
|
10
|
+
apiKey: "test-key",
|
|
11
11
|
};
|
|
12
|
-
const user = { id: 1, name:
|
|
12
|
+
const user = { id: 1, name: "Test", email: "test@example.com" };
|
|
13
13
|
let requestSpy;
|
|
14
14
|
beforeEach(() => {
|
|
15
|
-
requestSpy = jest
|
|
15
|
+
requestSpy = jest
|
|
16
|
+
.spyOn(BaseServiceWrapper.prototype, "request")
|
|
17
|
+
.mockImplementation(() => of(NetworkingUIEventWrapped.succeeded(user)));
|
|
16
18
|
});
|
|
17
19
|
afterEach(() => {
|
|
18
20
|
requestSpy.mockRestore();
|
|
19
21
|
});
|
|
20
|
-
it(
|
|
22
|
+
it("fetchUserById should return user (success)", (done) => {
|
|
21
23
|
const service = new UserService(config);
|
|
22
|
-
service
|
|
24
|
+
service
|
|
25
|
+
.fetchUserById(1)
|
|
26
|
+
.subscribe((result) => {
|
|
23
27
|
expect(result.response).toEqual(user);
|
|
24
28
|
done();
|
|
25
29
|
});
|
|
26
30
|
});
|
|
27
|
-
it(
|
|
31
|
+
it("fetchAllUsers should return users (success)", (done) => {
|
|
28
32
|
const service = new UserService(config);
|
|
29
|
-
service
|
|
33
|
+
service
|
|
34
|
+
.fetchAllUsers()
|
|
35
|
+
.subscribe((result) => {
|
|
30
36
|
expect(result.response).toEqual(user);
|
|
31
37
|
done();
|
|
32
38
|
});
|
|
33
39
|
});
|
|
34
|
-
it(
|
|
35
|
-
requestSpy.mockImplementationOnce(() => throwError(() => new Error(
|
|
40
|
+
it("request should handle error", (done) => {
|
|
41
|
+
requestSpy.mockImplementationOnce(() => throwError(() => new Error("Test error")));
|
|
36
42
|
const service = new UserService(config);
|
|
37
43
|
// Simulate error by calling a method that uses request
|
|
38
44
|
service.fetchUserById(1).subscribe({
|
|
39
45
|
error: (err) => {
|
|
40
46
|
expect(err).toBeInstanceOf(Error);
|
|
41
|
-
expect(err.message).toBe(
|
|
47
|
+
expect(err.message).toBe("Test error");
|
|
42
48
|
done();
|
|
43
49
|
},
|
|
44
50
|
});
|
package/dist/types/types.js
CHANGED
|
@@ -4,10 +4,10 @@ export class AlertButtonModel {
|
|
|
4
4
|
this.handler = handler;
|
|
5
5
|
}
|
|
6
6
|
static buttonYes(handler) {
|
|
7
|
-
return new AlertButtonModel(
|
|
7
|
+
return new AlertButtonModel("Yes", handler);
|
|
8
8
|
}
|
|
9
9
|
static buttonNo(handler) {
|
|
10
|
-
return new AlertButtonModel(
|
|
10
|
+
return new AlertButtonModel("No", handler);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
export class AlertModel {
|
|
@@ -26,7 +26,7 @@ export class AlertModel {
|
|
|
26
26
|
return this.httpErrorCode == 0;
|
|
27
27
|
}
|
|
28
28
|
static default() {
|
|
29
|
-
return new AlertModel(
|
|
29
|
+
return new AlertModel("Generic Error", 0, true, "", null, [
|
|
30
30
|
AlertButtonModel.buttonYes(),
|
|
31
31
|
]);
|
|
32
32
|
}
|
package/dist/types/types.test.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { NetworkingUIEventWrapped, AlertModel } from
|
|
2
|
-
describe(
|
|
3
|
-
it(
|
|
4
|
-
const wrap = NetworkingUIEventWrapped.succeeded({ foo:
|
|
5
|
-
expect(wrap.response).toEqual({ foo:
|
|
1
|
+
import { NetworkingUIEventWrapped, AlertModel } from "./types";
|
|
2
|
+
describe("NetworkingUIEventWrapped", () => {
|
|
3
|
+
it("should wrap succeeded response", () => {
|
|
4
|
+
const wrap = NetworkingUIEventWrapped.succeeded({ foo: "bar" });
|
|
5
|
+
expect(wrap.response).toEqual({ foo: "bar" });
|
|
6
6
|
expect(wrap.hasSuccess).toBe(true);
|
|
7
7
|
expect(wrap.hasFailed).toBe(false);
|
|
8
8
|
expect(wrap.isWaiting).toBe(false);
|
|
9
9
|
});
|
|
10
|
-
it(
|
|
11
|
-
const alert = new AlertModel(
|
|
10
|
+
it("should wrap failed response and set alertModel", () => {
|
|
11
|
+
const alert = new AlertModel("err", 500, true, "Error", { detail: "fail" });
|
|
12
12
|
const wrap = NetworkingUIEventWrapped.failed(alert);
|
|
13
13
|
expect(wrap.response).toBeNull();
|
|
14
14
|
expect(wrap.hasSuccess).toBe(false);
|
|
@@ -16,7 +16,7 @@ describe('NetworkingUIEventWrapped', () => {
|
|
|
16
16
|
expect(wrap.isWaiting).toBe(false);
|
|
17
17
|
expect(wrap.alertModel).toBe(alert);
|
|
18
18
|
});
|
|
19
|
-
it(
|
|
19
|
+
it("should wrap waiting state", () => {
|
|
20
20
|
const wrap = NetworkingUIEventWrapped.waiting();
|
|
21
21
|
expect(wrap.isWaiting).toBe(true);
|
|
22
22
|
expect(wrap.hasSuccess).toBe(false);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import Dexie from
|
|
1
|
+
import Dexie from "dexie";
|
|
2
2
|
export { Dexie };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
import axios, { HttpStatusCode } from
|
|
1
|
+
export * from "axios";
|
|
2
|
+
import axios, { HttpStatusCode } from "axios";
|
|
3
3
|
export { axios, HttpStatusCode };
|
|
4
|
-
export type { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig, AxiosRequestConfig } from
|
|
4
|
+
export type { AxiosInstance, AxiosResponse, AxiosError, InternalAxiosRequestConfig, AxiosRequestConfig, } from "axios";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
import axios, { HttpStatusCode } from
|
|
1
|
+
export * from "axios";
|
|
2
|
+
import axios, { HttpStatusCode } from "axios";
|
|
3
3
|
export { axios, HttpStatusCode };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil } from
|
|
1
|
+
import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil } from "rxjs";
|
|
2
2
|
export { Observable, Subject, BehaviorSubject, Subscription, Subscriber };
|
|
3
|
-
export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER };
|
|
3
|
+
export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER, };
|
|
4
4
|
export { shareReplay, filter };
|
|
5
5
|
export { catchError, throwError };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil } from
|
|
1
|
+
import { BehaviorSubject, Observable, Subject, Subscription, Subscriber, catchError, combineLatest, concatMap, distinctUntilChanged, filter, firstValueFrom, from, fromEvent, merge, NEVER, interval, map, mergeMap, of, pipe, shareReplay, startWith, tap, timeout, retry, throwError, combineLatestWith, debounceTime, delay, takeUntil, } from "rxjs";
|
|
2
2
|
export { Observable, Subject, BehaviorSubject, Subscription, Subscriber };
|
|
3
|
-
export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER };
|
|
3
|
+
export { startWith, firstValueFrom, from, fromEvent, tap, pipe, distinctUntilChanged, of, mergeMap, interval, map, concatMap, combineLatest, merge, combineLatestWith, debounceTime, delay, timeout, retry, takeUntil, NEVER, };
|
|
4
4
|
export { shareReplay, filter };
|
|
5
5
|
export { catchError, throwError };
|