import { provideHttpClient } from '@angular/common/http'; import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { CLOUD_FUNCTION_BASE_URL } from './admin.constants'; import { AdminSessionService } from './admin-session.service'; import { AppMigrationStatus } from './admin.models'; import { CloudFunctionsService } from './cloud-functions.service'; describe('CloudFunctionsService', () => { let service: CloudFunctionsService; let http: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ providers: [ provideHttpClient(), provideHttpClientTesting(), { provide: AdminSessionService, useValue: { session: () => ({ sessionToken: 'r:admin-session' }), logout: jasmine.createSpy('logout') } }, ], }); service = TestBed.inject(CloudFunctionsService); http = TestBed.inject(HttpTestingController); }); afterEach(() => http.verify()); it('loads the live app migration matrix with the admin Parse session', async () => { const pending = service.app('migration_status'); const request = http.expectOne(`${CLOUD_FUNCTION_BASE_URL}/xiaoshu/app/gateway`); expect(request.request.body).toEqual({ token: 'r:admin-session', params: { action: 'migration_status' } }); request.flush({ retcode: 0, retmsg: '', result: { implemented: ['app_update'], blocked: { cart_list: '目标 Schema 无购物车类' } } }); await expectAsync(pending).toBeResolvedTo({ implemented: ['app_update'], blocked: { cart_list: '目标 Schema 无购物车类' } }); }); it('calls the isolated operations gateway', async () => { const pending = service.operations('ops/users/list', { page: 1, pageSize: 20 }); const request = http.expectOne(`${CLOUD_FUNCTION_BASE_URL}/xiaoshu/ops/gateway-v3`); expect(request.request.body).toEqual({ token: 'r:admin-session', params: { operation: 'ops/users/list', page: 1, pageSize: 20 } }); request.flush({ success: true, data: { page: 1, pageSize: 20, total: 0, items: [] } }); await expectAsync(pending).toBeResolvedTo({ page: 1, pageSize: 20, total: 0, items: [] }); }); it('does not log out an authenticated user for a forbidden account-management action', async () => { const pending=service.admin('operatorAccounts/list'); const assertion=expectAsync(pending).toBeRejected(); http.expectOne(`${CLOUD_FUNCTION_BASE_URL}/xiaoshu/admin/gateway`).flush({message:'只有运营经理可以管理账号'},{status:403,statusText:'Forbidden'}); await assertion; expect(TestBed.inject(AdminSessionService).logout).not.toHaveBeenCalled(); }); });