api.service.spec.ts 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { provideHttpClient } from '@angular/common/http';
  2. import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
  3. import { TestBed } from '@angular/core/testing';
  4. import { API_CONFIG } from './app.constants';
  5. import { ApiError, ApiService } from './api.service';
  6. describe('ApiService', () => {
  7. let api: ApiService;
  8. let http: HttpTestingController;
  9. beforeEach(() => {
  10. TestBed.configureTestingModule({ providers: [provideHttpClient(), provideHttpClientTesting()] });
  11. api = TestBed.inject(ApiService);
  12. http = TestBed.inject(HttpTestingController);
  13. });
  14. afterEach(() => http.verify());
  15. it('routes migrated actions through the cloud gateway and parses JSON result strings', () => {
  16. let actual: unknown;
  17. api.get('node_list', { cpage: 1 }).subscribe((response) => actual = response.result);
  18. const request = http.expectOne(API_CONFIG.cloudFunctionUrl);
  19. expect(request.request.method).toBe('POST');
  20. expect(request.request.headers.get('X-Parse-Application-Id')).toBe(API_CONFIG.parseAppId);
  21. expect(request.request.body).toEqual({ params: { action: 'node_list', cpage: 1 } });
  22. request.flush({ retcode: 0, result: '[{"ID":1}]' });
  23. expect(actual).toEqual([{ ID: 1 }]);
  24. });
  25. it('keeps not-yet-migrated actions on the legacy gateway', () => {
  26. api.get('order_list', { cpage: 2 }).subscribe();
  27. const request = http.expectOne((candidate) => candidate.url.includes(API_CONFIG.endpoint) && candidate.urlWithParams.includes('action=order_list'));
  28. expect(request.request.method).toBe('GET');
  29. expect(request.request.params.get('cpage')).toBe('2');
  30. request.flush({ retcode: 0, result: [] });
  31. });
  32. it('nests reserved id parameters inside params', () => {
  33. api.get('node_get', { id: 81 }).subscribe();
  34. const request = http.expectOne(API_CONFIG.cloudFunctionUrl);
  35. expect(request.request.body).toEqual({ params: { action: 'node_get', id: 81 } });
  36. request.flush({ retcode: 0, result: { id: 81 } });
  37. });
  38. it('keeps addon-dependent content and product queries on the legacy gateway', () => {
  39. api.get('content_list', { modelId: 56, myfield2: 'UserId=42' }).subscribe();
  40. api.get('product_list', { cpage: 1 }).subscribe();
  41. const content = http.expectOne((candidate) => candidate.urlWithParams.includes('action=content_list'));
  42. const products = http.expectOne((candidate) => candidate.urlWithParams.includes('action=product_list'));
  43. expect(content.request.url).toContain(API_CONFIG.endpoint);
  44. expect(products.request.url).toContain(API_CONFIG.endpoint);
  45. content.flush({ retcode: 0, result: [] });
  46. products.flush({ retcode: 0, result: [] });
  47. });
  48. it('turns retcode -1 responses into ApiError', () => {
  49. let actual: unknown;
  50. api.post('user_login_passwd', {}).subscribe({ error: (error) => actual = error });
  51. http.expectOne(API_CONFIG.cloudFunctionUrl).flush({ retcode: -1, retmsg: '账号或密码错误', result: null }, { status: 401, statusText: 'Unauthorized' });
  52. http.expectOne((candidate) => candidate.urlWithParams.includes('action=user_login_passwd')).flush({ retcode: -1, retmsg: '登录失败', result: null });
  53. expect(actual instanceof ApiError).toBeTrue();
  54. expect((actual as ApiError).message).toBe('登录失败');
  55. });
  56. it('keeps a successful password login on the cloud response', () => {
  57. let actual: unknown;
  58. api.post('user_login_passwd', { name: 'tree', passwd: 'password' }).subscribe((response) => actual = response.result);
  59. http.expectOne(API_CONFIG.cloudFunctionUrl).flush({ retcode: 0, result: { userId: 42, sessionToken: 'r:token' } });
  60. http.expectNone((candidate) => candidate.url.includes(API_CONFIG.endpoint));
  61. expect(actual).toEqual({ userId: 42, sessionToken: 'r:token' });
  62. });
  63. });