Skip to content

Commit

Permalink
AD-280: Initial unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
kpieloch committed Oct 25, 2024
1 parent 6220e3e commit aba9633
Show file tree
Hide file tree
Showing 113 changed files with 1,213 additions and 59 deletions.
14 changes: 7 additions & 7 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,31 @@
"version": 1,
"newProjectRoot": "projects",
"projects": {
"@adyen/spartacus-payments": {
"@adyen/adyen-spartacus": {
"projectType": "library",
"root": "projects/adyen/spartacus-payments",
"sourceRoot": "projects/adyen/spartacus-payments/src",
"root": "projects/adyen/adyen-spartacus",
"sourceRoot": "projects/adyen/adyen-spartacus/src",
"prefix": "lib",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:ng-packagr",
"options": {
"project": "projects/adyen/spartacus-payments/ng-package.json"
"project": "projects/adyen/adyen-spartacus/ng-package.json"
},
"configurations": {
"production": {
"tsConfig": "projects/adyen/spartacus-payments/tsconfig.lib.prod.json"
"tsConfig": "projects/adyen/adyen-spartacus/tsconfig.lib.prod.json"
},
"development": {
"tsConfig": "projects/adyen/spartacus-payments/tsconfig.lib.json"
"tsConfig": "projects/adyen/adyen-spartacus/tsconfig.lib.json"
}
},
"defaultConfiguration": "production"
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
"options": {
"tsConfig": "projects/adyen/spartacus-payments/tsconfig.spec.json",
"tsConfig": "projects/adyen/adyen-spartacus/tsconfig.spec.json",
"polyfills": [
"zone.js",
"zone.js/testing"
Expand Down
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@
"build": "run-s lib:build showcase:build",
"test": "run-p lib:test showcase:test",
"test-coverage": "run-p lib:test-coverage showcase:test-coverage",
"lib:build": "ng build @adyen/spartacus-payments",
"lib:watch": "ng build @adyen/spartacus-payments --watch --configuration development",
"lib:test": "ng test @adyen/spartacus-payments",
"lib:test-coverage": "ng test @adyen/spartacus-payments --no-watch --code-coverage",
"lib:build": "ng build @adyen/adyen-spartacus",
"lib:watch": "ng build @adyen/adyen-spartacus --watch --configuration development",
"lib:test": "ng test @adyen/adyen-spartacus",
"lib:test-coverage": "ng test @adyen/adyen-spartacus --no-watch --code-coverage",
"lib:prebuild": "cd projects/adyen/spartacus-payment && npm version patch -m \"Upgrade to %s for build\" ",
"lib:schematics": "tsc -p tsconfig.schematics.json",
"lib:postbuild": "copyfiles schematics/*/files/** schematics/collection.json ../../dist/adyen-payments/",
"showcase:start-waiton": "wait-on dist/adyen/spartacus-payments/package.json && npm run showcase:start",
"showcase:start-waiton": "wait-on dist/adyen/adyen-spartacus/package.json && npm run showcase:start",
"showcase:start": "ng serve showcase",
"showcase:build": "ng build showcase",
"showcase:watch": "ng build showcase --watch --configuration development",
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../../dist/adyen/spartacus-payments",
"dest": "../../../dist/adyen/adyen-spartacus",
"lib": {
"entryFile": "src/public-api.ts"
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"name": "@adyen/spartacus-payments",
"name": "@adyen/adyen-spartacus",
"version": "1.0.0",
"schematics": "./schematics/collection.json",
"peerDependencies": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { of } from 'rxjs';
import { AdyenRedirectErrorComponent } from './adyen-redirect-error.component';
import { RoutingService, GlobalMessageService, GlobalMessageType, OCC_CART_ID_CURRENT, TranslationService, UserIdService } from '@spartacus/core';
import { MultiCartFacade } from '@spartacus/cart/base/root';

describe('AdyenRedirectErrorComponent', () => {
let component: AdyenRedirectErrorComponent;
let fixture: ComponentFixture<AdyenRedirectErrorComponent>;
let mockRoutingService: jasmine.SpyObj<RoutingService>;
let mockGlobalMessageService: jasmine.SpyObj<GlobalMessageService>;
let mockTranslationService: jasmine.SpyObj<TranslationService>;
let mockUserIdService: jasmine.SpyObj<UserIdService>;
let mockMultiCartFacade: jasmine.SpyObj<MultiCartFacade>;

beforeEach(async () => {
mockRoutingService = jasmine.createSpyObj('RoutingService', ['getParams', 'go']);
mockGlobalMessageService = jasmine.createSpyObj('GlobalMessageService', ['add']);
mockTranslationService = jasmine.createSpyObj('TranslationService', ['translate']);
mockUserIdService = jasmine.createSpyObj('UserIdService', ['takeUserId']);
mockMultiCartFacade = jasmine.createSpyObj('MultiCartFacade', ['reloadCart', 'loadCart', 'getCartIdByType']);

mockRoutingService.getParams.and.returnValue(of({ errorCode: btoa('someErrorCode') }));
mockTranslationService.translate.and.returnValue(of('translatedMessage'));
mockUserIdService.takeUserId.and.returnValue(of('userId'));
mockMultiCartFacade.getCartIdByType.and.returnValue(of('cartId'));

await TestBed.configureTestingModule({
declarations: [AdyenRedirectErrorComponent],
providers: [
{ provide: RoutingService, useValue: mockRoutingService },
{ provide: GlobalMessageService, useValue: mockGlobalMessageService },
{ provide: TranslationService, useValue: mockTranslationService },
{ provide: UserIdService, useValue: mockUserIdService },
{ provide: MultiCartFacade, useValue: mockMultiCartFacade }
]
}).compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(AdyenRedirectErrorComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});

it('should add error message and reload cart on init', () => {
const errorCode = 'someErrorCode';
const translatedMessage = 'translatedMessage';
const userId = 'userId';
const cartId = 'cartId';

mockRoutingService.getParams.and.returnValue(of({ errorCode: btoa(errorCode) }));
mockTranslationService.translate.and.returnValue(of(translatedMessage));
mockUserIdService.takeUserId.and.returnValue(of(userId));
mockMultiCartFacade.getCartIdByType.and.returnValue(of(cartId));

component.ngOnInit();

expect(mockTranslationService.translate).toHaveBeenCalledWith(component['placeOrderErrorCodePrefix'] + errorCode);
expect(mockGlobalMessageService.add).toHaveBeenCalledWith(translatedMessage, GlobalMessageType.MSG_TYPE_ERROR, component['messageTimeout']);
expect(mockMultiCartFacade.reloadCart).toHaveBeenCalledWith(OCC_CART_ID_CURRENT);
expect(mockMultiCartFacade.loadCart).toHaveBeenCalledWith({ cartId: OCC_CART_ID_CURRENT, userId });
expect(mockRoutingService.go).toHaveBeenCalledWith({ cxRoute: 'checkoutAdyenPaymentDetails' });
});

it('should unsubscribe from all subscriptions on destroy', () => {
spyOn(component['subscriptions'], 'unsubscribe');
component.ngOnDestroy();
expect(component['subscriptions'].unsubscribe).toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { of } from 'rxjs';
import { AdyenRedirectSuccessComponent } from './adyen-redirect-success.component';
import { RoutingService } from '@spartacus/core';
import { AdyenOrderService } from '../service/adyen-order.service';

describe('AdyenRedirectSuccessComponent', () => {
let component: AdyenRedirectSuccessComponent;
let fixture: ComponentFixture<AdyenRedirectSuccessComponent>;
let mockRoutingService: jasmine.SpyObj<RoutingService>;
let mockAdyenOrderService: jasmine.SpyObj<AdyenOrderService>;

beforeEach(async () => {
mockRoutingService = jasmine.createSpyObj('RoutingService', ['getParams', 'go']);
mockAdyenOrderService = jasmine.createSpyObj('AdyenOrderService', ['loadOrderDetails', 'getOrderDetails']);

// Ensure the mocked methods return Observables
mockRoutingService.getParams.and.returnValue(of({ orderCode: '12345' }));
mockAdyenOrderService.getOrderDetails.and.returnValue(of({}));

await TestBed.configureTestingModule({
declarations: [AdyenRedirectSuccessComponent],
providers: [
{ provide: RoutingService, useValue: mockRoutingService },
{ provide: AdyenOrderService, useValue: mockAdyenOrderService }
]
}).compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(AdyenRedirectSuccessComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});

it('should load order by code on init', () => {
const orderCode = '12345';
mockRoutingService.getParams.and.returnValue(of({ orderCode }));
mockAdyenOrderService.getOrderDetails.and.returnValue(of({}));

component.ngOnInit();

expect(mockAdyenOrderService.loadOrderDetails).toHaveBeenCalledWith(orderCode);
});

it('should navigate to order confirmation if order details are available', () => {
mockRoutingService.getParams.and.returnValue(of({ orderCode: '12345' }));
mockAdyenOrderService.getOrderDetails.and.returnValue(of({}));

component.ngOnInit();

expect(mockRoutingService.go).toHaveBeenCalledWith({ cxRoute: 'orderConfirmation' });
});

it('should not navigate if order details are not available', () => {
mockRoutingService.getParams.and.returnValue(of({ orderCode: '12345' }));
mockAdyenOrderService.getOrderDetails.and.returnValue(of(undefined));

component.ngOnInit();

expect(mockRoutingService.go).not.toHaveBeenCalled();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export class AdyenRedirectSuccessComponent implements OnInit {
})

this.adyenOrderService.getOrderDetails().subscribe((order) => {
if (order) {
if (order && order.code) {
this.routingService.go({cxRoute: 'orderConfirmation'});
}
})
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { AdyenCheckoutAdyenDeliveryAddressComponent } from './adyen-checkout-adyen-delivery-address.component';
import { UserAddressService, TranslationService, GlobalMessageService, Address } from '@spartacus/core';
import { ActiveCartFacade } from '@spartacus/cart/base/root';
import { CheckoutDeliveryAddressFacade } from '@spartacus/checkout/base/root';
import { CheckoutStepService } from '@spartacus/checkout/base/components';
import { AdyenAddressService } from '../../service/adyen-address.service';
import { of, BehaviorSubject } from 'rxjs';
import { ActivatedRoute } from '@angular/router';
import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'cxTranslate' })
class MockCxTranslatePipe implements PipeTransform {
transform(value: string): string {
return value;
}
}

describe('AdyenCheckoutAdyenDeliveryAddressComponent', () => {
let component: AdyenCheckoutAdyenDeliveryAddressComponent;
let fixture: ComponentFixture<AdyenCheckoutAdyenDeliveryAddressComponent>;
let mockUserAddressService: any;
let mockCheckoutDeliveryAddressFacade: any;
let mockActiveCartFacade: any;
let mockTranslationService: any;
let mockGlobalMessageService: any;
let mockAdyenAddressService: any;
let mockCheckoutStepService: any;
let mockActivatedRoute: any;

beforeEach(async () => {
mockUserAddressService = jasmine.createSpyObj('UserAddressService', ['loadAddresses', 'getAddresses', 'getAddressesLoading']);
mockUserAddressService.getAddressesLoading.and.returnValue(of(false));
mockCheckoutDeliveryAddressFacade = jasmine.createSpyObj('CheckoutDeliveryAddressFacade', ['getDeliveryAddressState']);
mockCheckoutDeliveryAddressFacade.getDeliveryAddressState.and.returnValue(of({ loading: false }));
mockActiveCartFacade = jasmine.createSpyObj('ActiveCartFacade', ['isGuestCart']);
mockActiveCartFacade.isGuestCart.and.returnValue(of(true));
mockTranslationService = jasmine.createSpyObj('TranslationService', ['translate']);
mockGlobalMessageService = jasmine.createSpyObj('GlobalMessageService', ['add']);
mockAdyenAddressService = jasmine.createSpyObj('AdyenAddressService', ['adyenAddUserAddress']);
mockCheckoutStepService = jasmine.createSpyObj('CheckoutStepService', ['next']);
mockActivatedRoute = { snapshot: { queryParamMap: { get: jasmine.createSpy().and.returnValue('sessionId') } } };

await TestBed.configureTestingModule({
declarations: [AdyenCheckoutAdyenDeliveryAddressComponent,MockCxTranslatePipe],
providers: [
{ provide: UserAddressService, useValue: mockUserAddressService },
{ provide: CheckoutDeliveryAddressFacade, useValue: mockCheckoutDeliveryAddressFacade },
{ provide: ActiveCartFacade, useValue: mockActiveCartFacade },
{ provide: TranslationService, useValue: mockTranslationService },
{ provide: GlobalMessageService, useValue: mockGlobalMessageService },
{ provide: AdyenAddressService, useValue: mockAdyenAddressService },
{ provide: CheckoutStepService, useValue: mockCheckoutStepService },
{ provide: ActivatedRoute, useValue: mockActivatedRoute },
]
}).compileComponents();
});

beforeEach(() => {
fixture = TestBed.createComponent(AdyenCheckoutAdyenDeliveryAddressComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});

it('should initialize component properties correctly', () => {
expect(component.sameAsDeliveryAddress).toBeTrue();
expect(component.selectedAddress$).toBeDefined();
});

it('should set selected address correctly in selectAddress', () => {
const address: Address = { id: 'test' } as Address;
component.selectAddress(address);
expect(component.selectedAddress$.getValue()).toEqual(address);
});

it('should add a new address and update state correctly in addAddress', () => {
const address: Address = { id: 'test' } as Address;
mockAdyenAddressService.adyenAddUserAddress.and.returnValue(of(address));
spyOn(component.setBillingAddress, 'emit');
component.addAddress(address);
expect(mockAdyenAddressService.adyenAddUserAddress).toHaveBeenCalledWith(address);
expect(component.setBillingAddress.emit).toHaveBeenCalledWith(address);
expect(component.selectedAddress$.getValue()).toEqual(address);
});

it('should toggle sameAsDeliveryAddress correctly', () => {
component.sameAsDeliveryAddress = true;
component.toggleSameAsDeliveryAddress();
expect(component.sameAsDeliveryAddress).toBeFalse();
component.toggleSameAsDeliveryAddress();
expect(component.sameAsDeliveryAddress).toBeTrue();
});
});
Loading

0 comments on commit aba9633

Please sign in to comment.