@smess/networking 1.0.3 → 1.0.5
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/dist/index.d.ts +9 -9
- package/dist/index.js +11 -31
- package/dist/scripts/real-test.js +184 -23
- package/dist/src/core/axios.d.ts +5 -12
- package/dist/src/core/axios.js +21 -24
- package/dist/src/core/axios.observable.d.ts +2 -2
- package/dist/src/core/axios.observable.js +14 -17
- package/dist/src/core/base.provider.advanced.test.js +3 -5
- package/dist/src/core/base.provider.d.ts +1 -1
- package/dist/src/core/base.provider.js +6 -6
- package/dist/src/core/base.provider.test.js +3 -5
- package/dist/src/core/base.service.wrapper.advanced.test.js +9 -11
- package/dist/src/core/base.service.wrapper.d.ts +1 -1
- package/dist/src/core/base.service.wrapper.js +3 -7
- package/dist/src/core/base.service.wrapper.test.js +6 -8
- package/dist/src/core/rx.http.service.d.ts +5 -12
- package/dist/src/core/rx.http.service.js +21 -24
- package/dist/src/services/auth.service.d.ts +10 -8
- package/dist/src/services/auth.service.js +31 -35
- package/dist/src/services/auth.service.test.js +38 -38
- package/dist/src/services/customer.service.d.ts +43 -0
- package/dist/src/services/customer.service.js +70 -0
- package/dist/src/services/customer.service.test.d.ts +1 -0
- package/dist/src/services/customer.service.test.js +96 -0
- package/dist/src/services/logger.service.js +4 -8
- package/dist/src/services/logger.service.test.js +16 -18
- package/dist/src/services/order.service.d.ts +60 -0
- package/dist/src/services/order.service.js +89 -0
- package/dist/src/services/order.service.test.d.ts +1 -0
- package/dist/src/services/order.service.test.js +135 -0
- package/dist/src/services/product.service.d.ts +6 -6
- package/dist/src/services/product.service.js +4 -9
- package/dist/src/services/product.service.test.js +20 -21
- package/dist/src/services/smess.service.d.ts +3 -2
- package/dist/src/services/smess.service.js +30 -39
- package/dist/src/services/smess.service.test.js +39 -46
- package/dist/src/services/store.service.d.ts +39 -0
- package/dist/src/services/store.service.js +73 -0
- package/dist/src/services/store.service.test.d.ts +1 -0
- package/dist/src/services/store.service.test.js +104 -0
- package/dist/src/services/user.service.d.ts +5 -5
- package/dist/src/services/user.service.js +4 -9
- package/dist/src/services/user.service.test.js +17 -18
- package/dist/src/types/types.d.ts +1 -3
- package/dist/src/types/types.js +6 -13
- package/dist/src/types/types.test.js +5 -7
- package/dist/src/utils/networking-import.js +3 -43
- package/dist/src/utils/rxjs-import.js +5 -34
- package/package.json +1 -1
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { CustomerService } from './customer.service.js';
|
|
2
|
+
import { NetworkingUIEventWrapped, AlertModel } from '../types/types.js';
|
|
3
|
+
import { of, BehaviorSubject } from 'rxjs';
|
|
4
|
+
describe('CustomerService', () => {
|
|
5
|
+
const config = {
|
|
6
|
+
baseUrl: 'https://api.example.com',
|
|
7
|
+
isProd: false,
|
|
8
|
+
clientId: 'test-client-id',
|
|
9
|
+
apiKey: 'test-api-key',
|
|
10
|
+
};
|
|
11
|
+
let service;
|
|
12
|
+
let $authToken;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
$authToken = new BehaviorSubject(null);
|
|
15
|
+
service = new CustomerService(config, $authToken);
|
|
16
|
+
});
|
|
17
|
+
it('register success', async () => {
|
|
18
|
+
const payload = {
|
|
19
|
+
email: 'test@example.com',
|
|
20
|
+
password: 'pass',
|
|
21
|
+
};
|
|
22
|
+
const response = { data: { id: 1, email: 'test@example.com' } };
|
|
23
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
24
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
25
|
+
});
|
|
26
|
+
const result = await service.register(payload).toPromise();
|
|
27
|
+
expect(result?.hasSuccess).toBe(true);
|
|
28
|
+
expect(result?.response).toEqual(response);
|
|
29
|
+
});
|
|
30
|
+
it('register error', async () => {
|
|
31
|
+
const payload = {
|
|
32
|
+
email: 'test@example.com',
|
|
33
|
+
password: 'pass',
|
|
34
|
+
};
|
|
35
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
36
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
37
|
+
});
|
|
38
|
+
const result = await service.register(payload).toPromise();
|
|
39
|
+
expect(result?.hasFailed).toBe(true);
|
|
40
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
41
|
+
});
|
|
42
|
+
it('getProfile success', async () => {
|
|
43
|
+
const response = { data: { id: 1, email: 'test@example.com' } };
|
|
44
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
45
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
46
|
+
});
|
|
47
|
+
const result = await service.getProfile().toPromise();
|
|
48
|
+
expect(result?.hasSuccess).toBe(true);
|
|
49
|
+
expect(result?.response).toEqual(response);
|
|
50
|
+
});
|
|
51
|
+
it('getProfile error', async () => {
|
|
52
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
53
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
54
|
+
});
|
|
55
|
+
const result = await service.getProfile().toPromise();
|
|
56
|
+
expect(result?.hasFailed).toBe(true);
|
|
57
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
58
|
+
});
|
|
59
|
+
it('updateProfile success', async () => {
|
|
60
|
+
const payload = {
|
|
61
|
+
name: 'Test',
|
|
62
|
+
address: '123 Main St',
|
|
63
|
+
postal_code: '12345',
|
|
64
|
+
city: 'City',
|
|
65
|
+
state: null,
|
|
66
|
+
country: null,
|
|
67
|
+
contact_email: null,
|
|
68
|
+
phone_number: null,
|
|
69
|
+
};
|
|
70
|
+
const response = { data: { id: 1, name: 'Test' } };
|
|
71
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
72
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
73
|
+
});
|
|
74
|
+
const result = await service.updateProfile(payload).toPromise();
|
|
75
|
+
expect(result?.hasSuccess).toBe(true);
|
|
76
|
+
expect(result?.response).toEqual(response);
|
|
77
|
+
});
|
|
78
|
+
it('updateProfile error', async () => {
|
|
79
|
+
const payload = {
|
|
80
|
+
name: 'Test',
|
|
81
|
+
address: '123 Main St',
|
|
82
|
+
postal_code: '12345',
|
|
83
|
+
city: 'City',
|
|
84
|
+
state: null,
|
|
85
|
+
country: null,
|
|
86
|
+
contact_email: null,
|
|
87
|
+
phone_number: null,
|
|
88
|
+
};
|
|
89
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
90
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
91
|
+
});
|
|
92
|
+
const result = await service.updateProfile(payload).toPromise();
|
|
93
|
+
expect(result?.hasFailed).toBe(true);
|
|
94
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.$logger = exports.LoggerService = exports.LogLevel = void 0;
|
|
4
|
-
var LogLevel;
|
|
1
|
+
export var LogLevel;
|
|
5
2
|
(function (LogLevel) {
|
|
6
3
|
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
7
4
|
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
8
5
|
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
9
6
|
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
10
7
|
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
11
|
-
})(LogLevel || (
|
|
12
|
-
class LoggerService {
|
|
8
|
+
})(LogLevel || (LogLevel = {}));
|
|
9
|
+
export class LoggerService {
|
|
13
10
|
constructor() {
|
|
14
11
|
this.currentLevel = LogLevel.DEBUG;
|
|
15
12
|
this.logs = [];
|
|
@@ -92,6 +89,5 @@ class LoggerService {
|
|
|
92
89
|
this.logs = [];
|
|
93
90
|
}
|
|
94
91
|
}
|
|
95
|
-
exports.LoggerService = LoggerService;
|
|
96
92
|
// Export singleton instance
|
|
97
|
-
|
|
93
|
+
export const $logger = new LoggerService();
|
|
@@ -1,33 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const logger_service_1 = require("./logger.service");
|
|
1
|
+
import { $logger, LogLevel } from './logger.service.js';
|
|
4
2
|
describe('LoggerService', () => {
|
|
5
3
|
beforeEach(() => {
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
$logger.clearLogs();
|
|
5
|
+
$logger.setLogLevel(LogLevel.DEBUG);
|
|
8
6
|
});
|
|
9
7
|
it('should log info', () => {
|
|
10
|
-
|
|
11
|
-
const logs =
|
|
12
|
-
expect(logs[0].level).toBe(
|
|
8
|
+
$logger.info('info message', { foo: 1 }, 'test');
|
|
9
|
+
const logs = $logger.getLogs();
|
|
10
|
+
expect(logs[0].level).toBe(LogLevel.INFO);
|
|
13
11
|
expect(logs[0].message).toBe('info message');
|
|
14
12
|
expect(logs[0].data).toEqual({ foo: 1 });
|
|
15
13
|
expect(logs[0].context).toBe('test');
|
|
16
14
|
});
|
|
17
15
|
it('should log warn and error', () => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const logs =
|
|
21
|
-
expect(logs[0].level).toBe(
|
|
22
|
-
expect(logs[1].level).toBe(
|
|
16
|
+
$logger.warn('warn message');
|
|
17
|
+
$logger.error('error message', { bar: 2 });
|
|
18
|
+
const logs = $logger.getLogs();
|
|
19
|
+
expect(logs[0].level).toBe(LogLevel.WARN);
|
|
20
|
+
expect(logs[1].level).toBe(LogLevel.ERROR);
|
|
23
21
|
expect(logs[1].data).toEqual({ bar: 2 });
|
|
24
22
|
});
|
|
25
23
|
it('should respect log level', () => {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const logs =
|
|
24
|
+
$logger.setLogLevel(LogLevel.ERROR);
|
|
25
|
+
$logger.info('should not log');
|
|
26
|
+
$logger.error('should log');
|
|
27
|
+
const logs = $logger.getLogs();
|
|
30
28
|
expect(logs.length).toBe(1);
|
|
31
|
-
expect(logs[0].level).toBe(
|
|
29
|
+
expect(logs[0].level).toBe(LogLevel.ERROR);
|
|
32
30
|
});
|
|
33
31
|
});
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ProviderType, NetworkingConfig, NetworkingUIEventWrapped, HttpResponse } from '../types/types.js';
|
|
2
|
+
import { SmessService } from './smess.service.js';
|
|
3
|
+
import { BehaviorSubject, Observable } from 'rxjs';
|
|
4
|
+
export type OrderTarget = 'order-list' | 'order-create' | 'order-delete' | 'order-get-draft' | 'order-update' | 'order-get';
|
|
5
|
+
export interface CreateOrderRequest extends UpdateOrderRequest {
|
|
6
|
+
}
|
|
7
|
+
export interface UpdateOrderRequest {
|
|
8
|
+
external_id?: string;
|
|
9
|
+
order_date: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
payment_status?: string;
|
|
13
|
+
delivery_note?: string;
|
|
14
|
+
delivery_fee?: number;
|
|
15
|
+
payment_method?: string;
|
|
16
|
+
payment_period?: string;
|
|
17
|
+
discount_in_percent?: number;
|
|
18
|
+
due_payment_amount?: number;
|
|
19
|
+
total_gst?: number;
|
|
20
|
+
total_exclude_gst?: number;
|
|
21
|
+
total_include_gst?: number;
|
|
22
|
+
order_items: OrderItemRequest[];
|
|
23
|
+
}
|
|
24
|
+
export interface OrderItemRequest {
|
|
25
|
+
product_name: string;
|
|
26
|
+
product_category: string;
|
|
27
|
+
supplier?: string;
|
|
28
|
+
supplier_code?: string;
|
|
29
|
+
supplier_item_name?: string;
|
|
30
|
+
unit: string;
|
|
31
|
+
quantity: number;
|
|
32
|
+
price_include_taxes: number;
|
|
33
|
+
vat_in_percent: number;
|
|
34
|
+
discount_in_percent?: number;
|
|
35
|
+
page_number?: number;
|
|
36
|
+
item_row_in_page?: number;
|
|
37
|
+
}
|
|
38
|
+
export declare class OrderProvider implements ProviderType {
|
|
39
|
+
private readonly config;
|
|
40
|
+
private readonly target;
|
|
41
|
+
private readonly $authToken;
|
|
42
|
+
constructor(config: NetworkingConfig, target: OrderTarget, $authToken: BehaviorSubject<string | null>);
|
|
43
|
+
get baseURL(): string;
|
|
44
|
+
get path(): string;
|
|
45
|
+
get method(): string;
|
|
46
|
+
get headers(): Record<string, string>;
|
|
47
|
+
getPath(...queryParams: unknown[]): string;
|
|
48
|
+
}
|
|
49
|
+
export declare class OrderService {
|
|
50
|
+
private readonly config;
|
|
51
|
+
private readonly $authToken;
|
|
52
|
+
constructor(config: NetworkingConfig, $authToken: BehaviorSubject<string | null>);
|
|
53
|
+
provider(target: OrderTarget): SmessService<OrderProvider>;
|
|
54
|
+
list(): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
55
|
+
create(payload: CreateOrderRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
56
|
+
delete(id: string): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
57
|
+
getDraft(): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
58
|
+
update(id: string, payload: UpdateOrderRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
59
|
+
get(id: string): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
60
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Accept, SMESSHeader, SmessService } from './smess.service.js';
|
|
2
|
+
export class OrderProvider {
|
|
3
|
+
constructor(config, target, $authToken) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.target = target;
|
|
6
|
+
this.$authToken = $authToken;
|
|
7
|
+
}
|
|
8
|
+
get baseURL() {
|
|
9
|
+
return this.config.version ? `${this.config.baseUrl}/${this.config.version}` : this.config.baseUrl;
|
|
10
|
+
}
|
|
11
|
+
get path() {
|
|
12
|
+
switch (this.target) {
|
|
13
|
+
case 'order-list':
|
|
14
|
+
return '/order/list';
|
|
15
|
+
case 'order-create':
|
|
16
|
+
return '/order/create';
|
|
17
|
+
case 'order-delete':
|
|
18
|
+
return '/order/${id}';
|
|
19
|
+
case 'order-get-draft':
|
|
20
|
+
return '/order/get-draft';
|
|
21
|
+
case 'order-update':
|
|
22
|
+
case 'order-get':
|
|
23
|
+
default:
|
|
24
|
+
return '/order/${id}';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
get method() {
|
|
28
|
+
switch (this.target) {
|
|
29
|
+
case 'order-list':
|
|
30
|
+
case 'order-get':
|
|
31
|
+
case 'order-get-draft':
|
|
32
|
+
return 'GET';
|
|
33
|
+
case 'order-create':
|
|
34
|
+
return 'POST';
|
|
35
|
+
case 'order-update':
|
|
36
|
+
return 'PUT';
|
|
37
|
+
case 'order-delete':
|
|
38
|
+
return 'DELETE';
|
|
39
|
+
default:
|
|
40
|
+
return 'GET';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
get headers() {
|
|
44
|
+
let headers = SmessService.getHeaders(Accept.V1, this.$authToken.value);
|
|
45
|
+
if (this.config.clientId) {
|
|
46
|
+
headers[SMESSHeader.ClientId] = this.config.clientId;
|
|
47
|
+
}
|
|
48
|
+
if (this.config.apiKey) {
|
|
49
|
+
headers[SMESSHeader.ApiKey] = this.config.apiKey;
|
|
50
|
+
}
|
|
51
|
+
return SmessService.filterHeaders(headers);
|
|
52
|
+
}
|
|
53
|
+
getPath(...queryParams) {
|
|
54
|
+
let definedPath = this.path;
|
|
55
|
+
const params = definedPath.match(/\$\{(.+?)\}/g);
|
|
56
|
+
params?.forEach((value, index) => {
|
|
57
|
+
definedPath = definedPath.replace(value, String(queryParams[index]));
|
|
58
|
+
});
|
|
59
|
+
return definedPath;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class OrderService {
|
|
63
|
+
constructor(config, $authToken) {
|
|
64
|
+
this.config = config;
|
|
65
|
+
this.$authToken = $authToken;
|
|
66
|
+
}
|
|
67
|
+
provider(target) {
|
|
68
|
+
const targetWrapper = new OrderProvider(this.config, target, this.$authToken);
|
|
69
|
+
return new SmessService(targetWrapper);
|
|
70
|
+
}
|
|
71
|
+
list() {
|
|
72
|
+
return this.provider('order-list').request();
|
|
73
|
+
}
|
|
74
|
+
create(payload) {
|
|
75
|
+
return this.provider('order-create').request(payload);
|
|
76
|
+
}
|
|
77
|
+
delete(id) {
|
|
78
|
+
return this.provider('order-delete').request(null, undefined, id);
|
|
79
|
+
}
|
|
80
|
+
getDraft() {
|
|
81
|
+
return this.provider('order-get-draft').request();
|
|
82
|
+
}
|
|
83
|
+
update(id, payload) {
|
|
84
|
+
return this.provider('order-update').request(payload, undefined, id);
|
|
85
|
+
}
|
|
86
|
+
get(id) {
|
|
87
|
+
return this.provider('order-get').request(null, undefined, id);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { OrderService } from './order.service.js';
|
|
2
|
+
import { NetworkingUIEventWrapped, AlertModel } from '../types/types.js';
|
|
3
|
+
import { of, BehaviorSubject } from 'rxjs';
|
|
4
|
+
describe('OrderService', () => {
|
|
5
|
+
const config = {
|
|
6
|
+
baseUrl: 'https://api.example.com',
|
|
7
|
+
isProd: false,
|
|
8
|
+
clientId: 'test-client-id',
|
|
9
|
+
apiKey: 'test-api-key',
|
|
10
|
+
};
|
|
11
|
+
let service;
|
|
12
|
+
let $authToken;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
$authToken = new BehaviorSubject(null);
|
|
15
|
+
service = new OrderService(config, $authToken);
|
|
16
|
+
});
|
|
17
|
+
it('list success', async () => {
|
|
18
|
+
const response = { data: [{ id: '1', status: 'draft' }] };
|
|
19
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
20
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
21
|
+
});
|
|
22
|
+
const result = await service.list().toPromise();
|
|
23
|
+
expect(result?.hasSuccess).toBe(true);
|
|
24
|
+
expect(result?.response).toEqual(response);
|
|
25
|
+
});
|
|
26
|
+
it('list error', async () => {
|
|
27
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
28
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
29
|
+
});
|
|
30
|
+
const result = await service.list().toPromise();
|
|
31
|
+
expect(result?.hasFailed).toBe(true);
|
|
32
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
33
|
+
});
|
|
34
|
+
it('create success', async () => {
|
|
35
|
+
const payload = {
|
|
36
|
+
order_date: '2024-01-01',
|
|
37
|
+
order_items: [],
|
|
38
|
+
};
|
|
39
|
+
const response = { data: { id: '1', status: 'created' } };
|
|
40
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
41
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
42
|
+
});
|
|
43
|
+
const result = await service.create(payload).toPromise();
|
|
44
|
+
expect(result?.hasSuccess).toBe(true);
|
|
45
|
+
expect(result?.response).toEqual(response);
|
|
46
|
+
});
|
|
47
|
+
it('create error', async () => {
|
|
48
|
+
const payload = {
|
|
49
|
+
order_date: '2024-01-01',
|
|
50
|
+
order_items: [],
|
|
51
|
+
};
|
|
52
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
53
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
54
|
+
});
|
|
55
|
+
const result = await service.create(payload).toPromise();
|
|
56
|
+
expect(result?.hasFailed).toBe(true);
|
|
57
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
58
|
+
});
|
|
59
|
+
it('delete success', async () => {
|
|
60
|
+
const response = { data: { id: '1', status: 'deleted' } };
|
|
61
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
62
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
63
|
+
});
|
|
64
|
+
const result = await service.delete('1').toPromise();
|
|
65
|
+
expect(result?.hasSuccess).toBe(true);
|
|
66
|
+
expect(result?.response).toEqual(response);
|
|
67
|
+
});
|
|
68
|
+
it('delete error', async () => {
|
|
69
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
70
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
71
|
+
});
|
|
72
|
+
const result = await service.delete('1').toPromise();
|
|
73
|
+
expect(result?.hasFailed).toBe(true);
|
|
74
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
75
|
+
});
|
|
76
|
+
it('getDraft success', async () => {
|
|
77
|
+
const response = { data: { id: 'draft', status: 'draft' } };
|
|
78
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
79
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
80
|
+
});
|
|
81
|
+
const result = await service.getDraft().toPromise();
|
|
82
|
+
expect(result?.hasSuccess).toBe(true);
|
|
83
|
+
expect(result?.response).toEqual(response);
|
|
84
|
+
});
|
|
85
|
+
it('getDraft error', async () => {
|
|
86
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
87
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
88
|
+
});
|
|
89
|
+
const result = await service.getDraft().toPromise();
|
|
90
|
+
expect(result?.hasFailed).toBe(true);
|
|
91
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
92
|
+
});
|
|
93
|
+
it('update success', async () => {
|
|
94
|
+
const payload = {
|
|
95
|
+
order_date: '2024-01-01',
|
|
96
|
+
order_items: [],
|
|
97
|
+
};
|
|
98
|
+
const response = { data: { id: '1', status: 'updated' } };
|
|
99
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
100
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
101
|
+
});
|
|
102
|
+
const result = await service.update('1', payload).toPromise();
|
|
103
|
+
expect(result?.hasSuccess).toBe(true);
|
|
104
|
+
expect(result?.response).toEqual(response);
|
|
105
|
+
});
|
|
106
|
+
it('update error', async () => {
|
|
107
|
+
const payload = {
|
|
108
|
+
order_date: '2024-01-01',
|
|
109
|
+
order_items: [],
|
|
110
|
+
};
|
|
111
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
112
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
113
|
+
});
|
|
114
|
+
const result = await service.update('1', payload).toPromise();
|
|
115
|
+
expect(result?.hasFailed).toBe(true);
|
|
116
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
117
|
+
});
|
|
118
|
+
it('get success', async () => {
|
|
119
|
+
const response = { data: { id: '1', status: 'fetched' } };
|
|
120
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
121
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
122
|
+
});
|
|
123
|
+
const result = await service.get('1').toPromise();
|
|
124
|
+
expect(result?.hasSuccess).toBe(true);
|
|
125
|
+
expect(result?.response).toEqual(response);
|
|
126
|
+
});
|
|
127
|
+
it('get error', async () => {
|
|
128
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
129
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
130
|
+
});
|
|
131
|
+
const result = await service.get('1').toPromise();
|
|
132
|
+
expect(result?.hasFailed).toBe(true);
|
|
133
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { BaseProvider } from '../core/base.provider';
|
|
2
|
-
import { BaseServiceWrapper } from '../core/base.service.wrapper';
|
|
3
|
-
import { NetworkingConfig } from '../types/types';
|
|
1
|
+
import { BaseProvider } from '../core/base.provider.js';
|
|
2
|
+
import { BaseServiceWrapper } from '../core/base.service.wrapper.js';
|
|
3
|
+
import { NetworkingConfig } from '../types/types.js';
|
|
4
4
|
export interface Product {
|
|
5
5
|
id: number;
|
|
6
6
|
name: string;
|
|
@@ -15,7 +15,7 @@ export declare class ProductProvider extends BaseProvider {
|
|
|
15
15
|
export declare class ProductService extends BaseServiceWrapper<ProductProvider> {
|
|
16
16
|
private config;
|
|
17
17
|
constructor(config: NetworkingConfig, productId?: number, method?: string);
|
|
18
|
-
fetchProductById(id: number): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product>>;
|
|
19
|
-
fetchAllProducts(): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product[]>>;
|
|
20
|
-
createProduct(product: Omit<Product, 'id'>): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product>>;
|
|
18
|
+
fetchProductById(id: number): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product>>;
|
|
19
|
+
fetchAllProducts(): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product[]>>;
|
|
20
|
+
createProduct(product: Omit<Product, 'id'>): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product>>;
|
|
21
21
|
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.ProductService = exports.ProductProvider = void 0;
|
|
4
|
-
const base_provider_1 = require("../core/base.provider");
|
|
5
|
-
const base_service_wrapper_1 = require("../core/base.service.wrapper");
|
|
1
|
+
import { BaseProvider } from '../core/base.provider.js';
|
|
2
|
+
import { BaseServiceWrapper } from '../core/base.service.wrapper.js';
|
|
6
3
|
// ProductProvider implements ProviderType for product endpoints
|
|
7
|
-
class ProductProvider extends
|
|
4
|
+
export class ProductProvider extends BaseProvider {
|
|
8
5
|
constructor(config, { productId, method } = {}) {
|
|
9
6
|
super({
|
|
10
7
|
config,
|
|
@@ -15,9 +12,8 @@ class ProductProvider extends base_provider_1.BaseProvider {
|
|
|
15
12
|
});
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
|
-
exports.ProductProvider = ProductProvider;
|
|
19
15
|
// ProductService provides high-level methods for product API
|
|
20
|
-
class ProductService extends
|
|
16
|
+
export class ProductService extends BaseServiceWrapper {
|
|
21
17
|
constructor(config, productId, method) {
|
|
22
18
|
super(new ProductProvider(config, { productId, method }));
|
|
23
19
|
this.config = config;
|
|
@@ -38,7 +34,6 @@ class ProductService extends base_service_wrapper_1.BaseServiceWrapper {
|
|
|
38
34
|
return this.request(product);
|
|
39
35
|
}
|
|
40
36
|
}
|
|
41
|
-
exports.ProductService = ProductService;
|
|
42
37
|
// Example usage:
|
|
43
38
|
// setNetworkingConfig({ baseUrl: 'https://fakestoreapi.com', isProd: false });
|
|
44
39
|
// const productService = new ProductService();
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const rxjs_1 = require("rxjs");
|
|
6
|
-
const base_service_wrapper_1 = require("../core/base.service.wrapper");
|
|
1
|
+
import { ProductService } from './product.service.js';
|
|
2
|
+
import { NetworkingUIEventWrapped } from '../types/types.js';
|
|
3
|
+
import { of, throwError } from 'rxjs';
|
|
4
|
+
import { BaseServiceWrapper } from '../core/base.service.wrapper.js';
|
|
7
5
|
describe('ProductService', () => {
|
|
8
6
|
const config = {
|
|
9
7
|
baseUrl: 'https://jsonplaceholder.typicode.com',
|
|
@@ -14,37 +12,38 @@ describe('ProductService', () => {
|
|
|
14
12
|
const product = { id: 1, name: 'Product', price: 10 };
|
|
15
13
|
let requestSpy;
|
|
16
14
|
beforeEach(() => {
|
|
17
|
-
requestSpy = jest.spyOn(
|
|
15
|
+
requestSpy = jest.spyOn(BaseServiceWrapper.prototype, 'request').mockImplementation(() => of(NetworkingUIEventWrapped.succeeded(product)));
|
|
18
16
|
});
|
|
19
17
|
afterEach(() => {
|
|
20
18
|
requestSpy.mockRestore();
|
|
21
19
|
});
|
|
22
|
-
it('should fetch product by id', done => {
|
|
23
|
-
const service = new
|
|
24
|
-
service.fetchProductById(1).subscribe(result => {
|
|
20
|
+
it('should fetch product by id', (done) => {
|
|
21
|
+
const service = new ProductService(config, 1);
|
|
22
|
+
service.fetchProductById(1).subscribe((result) => {
|
|
25
23
|
expect(result.response).toEqual(product);
|
|
26
24
|
done();
|
|
27
25
|
});
|
|
28
26
|
});
|
|
29
|
-
it('should fetch all products', done => {
|
|
30
|
-
const service = new
|
|
31
|
-
service.fetchAllProducts().subscribe(result => {
|
|
27
|
+
it('should fetch all products', (done) => {
|
|
28
|
+
const service = new ProductService(config);
|
|
29
|
+
service.fetchAllProducts().subscribe((result) => {
|
|
32
30
|
expect(result.response).toEqual(product);
|
|
33
31
|
done();
|
|
34
32
|
});
|
|
35
33
|
});
|
|
36
|
-
it('should create a product', done => {
|
|
37
|
-
const service = new
|
|
38
|
-
service.createProduct({ name: 'New Product', price: 99.99 }).subscribe(result => {
|
|
34
|
+
it('should create a product', (done) => {
|
|
35
|
+
const service = new ProductService(config);
|
|
36
|
+
service.createProduct({ name: 'New Product', price: 99.99 }).subscribe((result) => {
|
|
39
37
|
expect(result.response).toEqual(product);
|
|
40
38
|
done();
|
|
41
39
|
});
|
|
42
40
|
});
|
|
43
|
-
it('request should handle error', done => {
|
|
44
|
-
requestSpy.mockImplementationOnce(() =>
|
|
45
|
-
const service = new
|
|
46
|
-
|
|
47
|
-
|
|
41
|
+
it('request should handle error', (done) => {
|
|
42
|
+
requestSpy.mockImplementationOnce(() => throwError(() => new Error('Test error')));
|
|
43
|
+
const service = new ProductService(config);
|
|
44
|
+
// Simulate error by calling a method that uses request
|
|
45
|
+
service.fetchProductById(1).subscribe({
|
|
46
|
+
error: (err) => {
|
|
48
47
|
expect(err).toBeInstanceOf(Error);
|
|
49
48
|
expect(err.message).toBe('Test error');
|
|
50
49
|
done();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Observable } from '../utils/rxjs-import';
|
|
1
|
+
import { ProviderType, NetworkingUIEventWrapped, HeaderType } from '../types/types.js';
|
|
2
|
+
import { Observable } from '../utils/rxjs-import.js';
|
|
3
3
|
export declare enum SMESSHeader {
|
|
4
4
|
ContentType = "Content-Type",
|
|
5
5
|
Authorization = "Authorization",
|
|
@@ -28,6 +28,7 @@ export declare class SmessService<T extends ProviderType> {
|
|
|
28
28
|
private target;
|
|
29
29
|
constructor(target: T);
|
|
30
30
|
static getHeaders(version: Accept, authorization?: string | null, options?: HeaderType): Partial<Record<SMESSHeader, string | undefined>>;
|
|
31
|
+
static filterHeaders(headers: Partial<Record<SMESSHeader, string | undefined>>): Record<string, string>;
|
|
31
32
|
private static commonHeaders;
|
|
32
33
|
request<R = unknown>(request?: unknown, mockResponse?: R, ...queryParams: unknown[]): Observable<NetworkingUIEventWrapped<R>>;
|
|
33
34
|
private transformAxiosError;
|