Skip to content

Commit d1f26ef

Browse files
authored
test: qbo base mapping (#999)
* test: QBO complete export log * lint fix * test: qbo skipped export log component * rem failing assertions * updated tests and fixtures * fixed breaking tests * lint fixes * pr comments * test: qbo mapping * fixed assertions * lint fixes * test: qbo base mapping * lint fix * additional fixtures and test * fix conflicts * lint fixes * lint * lint fix
1 parent d3c722a commit d1f26ef

File tree

2 files changed

+170
-7
lines changed

2 files changed

+170
-7
lines changed
Lines changed: 154 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,171 @@
1+
/* eslint-disable max-lines */
2+
/* eslint-disable dot-notation */
13
import { ComponentFixture, TestBed } from '@angular/core/testing';
2-
4+
import { ActivatedRoute } from '@angular/router';
5+
import { of, throwError } from 'rxjs';
36
import { QboBaseMappingComponent } from './qbo-base-mapping.component';
7+
import { MappingService } from 'src/app/core/services/common/mapping.service';
8+
import { IntegrationsToastService } from 'src/app/core/services/common/integrations-toast.service';
9+
import { WorkspaceService } from 'src/app/core/services/common/workspace.service';
10+
import { QboImportSettingsService } from 'src/app/core/services/qbo/qbo-configuration/qbo-import-settings.service';
11+
import { AccountingDisplayName, AccountingField, FyleField, ToastSeverity } from 'src/app/core/models/enum/enum.model';
12+
import { mockCreditCardAccounts, mockGeneralSettings, mockImportSettings, mockMappingSetting } from '../../../qbo.fixture';
13+
import { QBOWorkspaceGeneralSetting } from 'src/app/core/models/qbo/db/workspace-general-setting.model';
14+
import { MappingSetting } from 'src/app/core/models/db/mapping-setting.model';
15+
import { QBOImportSettingGet } from 'src/app/core/models/qbo/qbo-configuration/qbo-import-setting.model';
416

5-
xdescribe('QboBaseMappingComponent', () => {
17+
describe('QboBaseMappingComponent', () => {
618
let component: QboBaseMappingComponent;
719
let fixture: ComponentFixture<QboBaseMappingComponent>;
20+
let mockActivatedRoute: any;
21+
let mockMappingService: jasmine.SpyObj<MappingService>;
22+
let mockToastService: jasmine.SpyObj<IntegrationsToastService>;
23+
let mockWorkspaceService: jasmine.SpyObj<WorkspaceService>;
24+
let mockImportSettingsService: jasmine.SpyObj<QboImportSettingsService>;
825

926
beforeEach(async () => {
27+
mockActivatedRoute = {
28+
params: of({ source_field: 'EMPLOYEE' }),
29+
snapshot: {
30+
params: { source_field: 'EMPLOYEE' }
31+
}
32+
};
33+
34+
mockMappingService = jasmine.createSpyObj('MappingService', ['triggerAutoMapEmployees', 'getMappingSettings', 'getPaginatedDestinationAttributes']);
35+
mockToastService = jasmine.createSpyObj('IntegrationsToastService', ['displayToastMessage']);
36+
mockWorkspaceService = jasmine.createSpyObj('WorkspaceService', ['getWorkspaceGeneralSettings']);
37+
mockImportSettingsService = jasmine.createSpyObj('QboImportSettingsService', ['getImportSettings']);
38+
1039
await TestBed.configureTestingModule({
11-
declarations: [ QboBaseMappingComponent ]
12-
})
13-
.compileComponents();
40+
declarations: [ QboBaseMappingComponent ],
41+
providers: [
42+
{ provide: ActivatedRoute, useValue: mockActivatedRoute },
43+
{ provide: MappingService, useValue: mockMappingService },
44+
{ provide: IntegrationsToastService, useValue: mockToastService },
45+
{ provide: WorkspaceService, useValue: mockWorkspaceService },
46+
{ provide: QboImportSettingsService, useValue: mockImportSettingsService }
47+
]
48+
}).compileComponents();
1449

1550
fixture = TestBed.createComponent(QboBaseMappingComponent);
1651
component = fixture.componentInstance;
17-
fixture.detectChanges();
1852
});
1953

2054
it('should create', () => {
2155
expect(component).toBeTruthy();
2256
});
57+
58+
it('should trigger auto map employees successfully', () => {
59+
mockMappingService.triggerAutoMapEmployees.and.returnValue(of(null));
60+
61+
component.triggerAutoMapEmployees();
62+
63+
expect(component.isLoading).toBeFalse();
64+
expect(mockToastService.displayToastMessage).toHaveBeenCalledWith(ToastSeverity.INFO, 'Auto mapping of employees may take few minutes');
65+
});
66+
67+
it('should handle error when triggering auto map employees', () => {
68+
mockMappingService.triggerAutoMapEmployees.and.returnValue(throwError('Error'));
69+
70+
component.triggerAutoMapEmployees();
71+
72+
expect(component.isLoading).toBeFalse();
73+
expect(mockToastService.displayToastMessage).toHaveBeenCalledWith(ToastSeverity.ERROR, 'Something went wrong, please try again');
74+
});
75+
76+
it('should handle route parameter changes', () => {
77+
mockWorkspaceService.getWorkspaceGeneralSettings.and.returnValue(of(mockGeneralSettings));
78+
mockMappingService.getMappingSettings.and.returnValue(of({ count: 1, next: null, previous: null, results: mockImportSettings.mapping_settings }));
79+
mockImportSettingsService.getImportSettings.and.returnValue(of(mockImportSettings));
80+
mockMappingService.getPaginatedDestinationAttributes.and.returnValue(of(mockCreditCardAccounts));
81+
82+
mockActivatedRoute.params = of({ source_field: 'Vendor' });
83+
fixture.detectChanges();
84+
85+
expect(component.sourceField).toBe(FyleField.EMPLOYEE);
86+
expect(component.isLoading).toBeFalse();
87+
});
88+
89+
it('should return employee_field_mapping when sourceField is EMPLOYEE', () => {
90+
component.sourceField = FyleField.EMPLOYEE;
91+
const workspaceGeneralSetting = { employee_field_mapping: 'VENDOR' } as QBOWorkspaceGeneralSetting;
92+
const mappingSettings: MappingSetting[] = [];
93+
94+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
95+
expect(result).toBe('VENDOR');
96+
});
97+
98+
it('should return ACCOUNT when sourceField is CATEGORY', () => {
99+
component.sourceField = FyleField.CATEGORY;
100+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
101+
const mappingSettings: MappingSetting[] = [];
102+
103+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
104+
expect(result).toBe(AccountingField.ACCOUNT);
105+
});
106+
107+
it('should return destination_field from mappingSettings for other sourceFields', () => {
108+
component.sourceField = FyleField.CATEGORY;
109+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
110+
const mappingSettings: MappingSetting[] = [
111+
{
112+
source_field: FyleField.CATEGORY,
113+
destination_field: AccountingField.ACCOUNT,
114+
id: 0,
115+
created_at: new Date(),
116+
updated_at: new Date(),
117+
workspace: 0,
118+
import_to_fyle: false,
119+
is_custom: false,
120+
source_placeholder: null
121+
}
122+
];
123+
124+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
125+
expect(result).toBe('ACCOUNT');
126+
});
127+
128+
it('should return empty string if no matching mapping setting is found', () => {
129+
component.sourceField = FyleField.VENDOR;
130+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
131+
const mappingSettings: MappingSetting[] = [];
132+
133+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
134+
expect(result).toBe('');
135+
});
136+
137+
it('should return employee_field_mapping when sourceField is EMPLOYEE', () => {
138+
component.sourceField = FyleField.EMPLOYEE;
139+
const workspaceGeneralSetting = { employee_field_mapping: 'VENDOR' } as QBOWorkspaceGeneralSetting;
140+
const mappingSettings: MappingSetting[] = [];
141+
142+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
143+
expect(result).toBe('VENDOR');
144+
});
145+
146+
it('should return ACCOUNT when sourceField is CATEGORY', () => {
147+
component.sourceField = FyleField.CATEGORY;
148+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
149+
const mappingSettings: MappingSetting[] = [];
150+
151+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
152+
expect(result).toBe(AccountingField.ACCOUNT);
153+
});
154+
155+
it('should return destination_field from mappingSettings for VENDOR sourceField', () => {
156+
component.sourceField = FyleField.VENDOR;
157+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
158+
159+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mockMappingSetting);
160+
expect(result).toBe(AccountingField.ACCOUNT);
161+
});
162+
163+
it('should return empty string if no matching mapping setting is found', () => {
164+
component.sourceField = FyleField.VENDOR;
165+
const workspaceGeneralSetting = {} as QBOWorkspaceGeneralSetting;
166+
const mappingSettings: MappingSetting[] = [];
167+
168+
const result = (component as any).getDestinationField(workspaceGeneralSetting, mappingSettings);
169+
expect(result).toBe('');
170+
});
23171
});

src/app/integrations/qbo/qbo.fixture.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { MinimalUser } from "src/app/core/models/db/user.model";
2-
import { AutoMapEmployeeOptions, EmployeeFieldMapping, CCCExpenseState, ExpenseState, ExportDateType, NameInJournalEntry, QBOCorporateCreditCardExpensesObject, QBOOnboardingState, SplitExpenseGrouping, QBOReimbursableExpensesObject, QboExportSettingDestinationOptionKey, Operator, AccountingErrorType, TaskLogState, QBOTaskLogType } from "src/app/core/models/enum/enum.model";
2+
import { AutoMapEmployeeOptions, EmployeeFieldMapping, CCCExpenseState, ExpenseState, ExportDateType, NameInJournalEntry, QBOCorporateCreditCardExpensesObject, QBOOnboardingState, SplitExpenseGrouping, QBOReimbursableExpensesObject, QboExportSettingDestinationOptionKey, Operator, AccountingErrorType, TaskLogState, QBOTaskLogType, AccountingField } from "src/app/core/models/enum/enum.model";
33
import { QBOEmployeeSettingGet, QBOEmployeeSettingPost } from "src/app/core/models/qbo/qbo-configuration/qbo-employee-setting.model";
44
import { GroupedDestinationAttribute, PaginatedDestinationAttribute } from 'src/app/core/models/db/destination-attribute.model';
55
import { SelectFormOption } from "src/app/core/models/common/select-form-option.model";
@@ -13,6 +13,7 @@ import { AccountingExport } from "src/app/core/models/db/accounting-export.model
1313
import { ExpenseGroupResponse } from "src/app/core/models/db/expense-group.model";
1414
import { SkipExportLogResponse } from "src/app/core/models/intacct/db/expense-group.model";
1515
import { Paginator } from "src/app/core/models/misc/paginator.model";
16+
import { MappingSetting } from "src/app/core/models/db/mapping-setting.model";
1617

1718
export const mockUser: MinimalUser = {
1819
org_id: '123',
@@ -2442,4 +2443,18 @@ export const mockemployeeAttributes = {
24422443

24432444
export const mockMappingStats = {"all_attributes_count": 105, "unmapped_attributes_count": 92};
24442445

2446+
export const mockMappingSetting: MappingSetting[] = [
2447+
{
2448+
source_field: 'VENDOR',
2449+
destination_field: AccountingField.ACCOUNT,
2450+
id: 0,
2451+
created_at: new Date(),
2452+
updated_at: new Date(),
2453+
workspace: 0,
2454+
import_to_fyle: false,
2455+
is_custom: false,
2456+
source_placeholder: null
2457+
}
2458+
];
2459+
24452460
export const mockPageSize = { limit: 10, offset: 0 };

0 commit comments

Comments
 (0)