// import { Component, OnInit, OnDestroy } from '@angular/core'; // import { Router, ActivatedRoute } from '@angular/router'; import { SharedService } from '../../../shared/shared.service'; import { CartService } from '../../../services/cart.service'; import { CustomerService } from '../../../services/customer.service'; // import { DebugElement } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { Observable } from 'rxjs/Rx'; import CartUtils from '../../../shared/cart.utils'; import { TestBed, async, fakeAsync, ComponentFixture } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { packagesData, customerSearchResponse, removeDeviceResponse, creditCheckResponse, sortByResponse } from '../../../shared/spec.constants'; import { PopupComponent } from '../../../shared/popup/popup.component'; import { UserService } from '../../../services/user.service'; import { LookupService } from '../../../services/lookup.service'; import { CatalogService } from '../../../services/catalog.service'; import { Customer } from '../../../shared/modal/customer'; import { Cart } from '../../../shared/modal/cart'; import { MIDevicesComponent } from './mi-devices.component'; import { CartServiceStub } from '../../../services/cart.service.stub'; import { EspotComponent } from '../../espot/espot.component'; import { RelatedAccComponent } from '../related-acc/related-acc.component'; import { MoreDetailsComponent } from '../../moredetails/more-details.component'; import { CompareComponent } from '../../compare/compare.component'; import { IDevice } from '../../../shared/modal/common'; import { packageMockData, packageData, userMockData, deviceItem, cartData, deviceData, deviceDataNonIsByos } from '../../../shared/mock-data'; import { TradeinService } from '../../../services/tradein.service'; import { LoggingService } from '../../../services/logging.service'; import { CheckoutService } from '../../../services/checkout.service'; import { MarketingService } from '../../../services/marketing.service'; import { SORT_BY_OPTIONS } from '../../../shared/form.constants'; import { OffersComponent } from '../../offers/offers.component'; import { HttpClient, HttpHandler } from '@angular/common/http'; import { CompareService } from '../../../shared/compare-modal.service'; import { MoreDetailsService } from '../../../shared/more-details-modal.service'; describe('MI devices component', () => { let miDevicesObject: MIDevicesComponent; let fixture: ComponentFixture; let dataStub: CartServiceStub; let cartUtils: CartUtils; let devicesItem: IDevice; beforeEach(async(() => { TestBed.configureTestingModule({ providers: [ SharedService, CatalogService, LookupService, UserService, CartService, CustomerService, TradeinService, LoggingService, CheckoutService, MarketingService, HttpClient, HttpHandler, CompareService, MoreDetailsService ], imports: [ FormsModule, RouterTestingModule ], declarations: [MIDevicesComponent, PopupComponent, EspotComponent, CompareComponent, RelatedAccComponent, MoreDetailsComponent, OffersComponent] }); fixture = TestBed.createComponent(MIDevicesComponent); miDevicesObject = fixture.componentInstance; miDevicesObject.cartService.cart = cartData; miDevicesObject['cart'] = cartData; miDevicesObject.financeType = 'frp'; miDevicesObject.package = packagesData[0]; miDevicesObject['deviceItem'] = [{ itemId: 12345, name: 'string', description: 'string', deviceSKU: 'iPhone50', isByos: false, thumbNail: 'string', fullImage: 'string', colorName: 'string', colorImageUrl: 'string', isRefurbished: false, status: 'string', shipDateFrom: '04/12/2017', shipDateTo: '04/12/2017', suggestedPrice: 12345, instantDiscount: 12345, openBoxDiscount: 12345, promotionDiscount: 12345, mailInRebate: 12345, finalPrice: 12345, loan: [{ crp: 1, term: 1, downPayment: 1, monthlyPrice: 1 }], lease: [{ crp: 1, term: 1, downPayment: 1, monthlyPrice: 1, residualPrice: 1 }], state: 'string', sim: 'string' }]; miDevicesObject.customerService.customer = customerSearchResponse; let simOnlyDevice = { productId: 110, productType: 'string', categoryId: 12345, manufacturer: 'Apple', categoryName: 'string', name: 'string', description: 'string', descriptions: [], // soc: 'string', items: deviceItem, itemList: deviceItem, startDate: '04/12/2017', endDate: '04/12/2017', newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 0, canCompare: false }; let smartPhoneDevice = { productId: 210, productType: 'string', categoryId: 12345, categoryName: 'string', manufacturer: 'Apple', name: 'string', description: 'string', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', // soc: 'string', items: deviceItem, itemList: deviceItem, newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 1, canCompare: true }; miDevicesObject['devices'] = [simOnlyDevice, smartPhoneDevice]; miDevicesObject.catalogService.miDevices = [ { productId: 110, startDate: '04/12/2017', endDate: '04/12/2017', productType: 'string', manufacturer: 'Apple', categoryId: 1, categoryName: 'string', name: 'string', description: 'string', // soc: 'string', items: deviceItem, itemList: deviceItem, newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 1, descriptions: [], canCompare: false } ]; miDevicesObject['devices'] = miDevicesObject.catalogService.miDevices; miDevicesObject['filters'] = [{ type: 'Device Type', items: [{ name: 'SIM card only', productIds: [110, 111, 112], // for local isChecked: true }, { name: 'Smartphone', productIds: [210, 211, 212], // for local isChecked: false }] }]; miDevicesObject.catalogService.miDevices = [{ productId: 12345, productType: 'string', categoryId: 12345, manufacturer: 'Apple', categoryName: 'string', startDate: '04/12/2017', endDate: '04/12/2017', name: 'string', description: 'string', descriptions: [], // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 0, canCompare: true }, { productId: 12346, productType: 'string', categoryId: 123456, categoryName: 'string', manufacturer: 'Apple', name: 'string', description: 'string', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 0, canCompare: true } ] devicesItem = { productId: 1234, productType: 'string', categoryId: 1234, categoryName: 'string', name: 'string', description: 'string', startDate: '04/12/2017', manufacturer: 'Apple', endDate: '04/12/2017', newPHPSOC: 'string', descriptions: [], // soc: 'string', items: [{ itemId: 1234, name: 'string', description: 'string', deviceSKU: 'string', isByos: true, sim: 'string', thumbNail: 'string', fullImage: 'string', colorName: 'string', colorImageUrl: 'string', isRefurbished: true, status: 'string', shipDateFrom: '04/12/2017', shipDateTo: '04/12/2017', suggestedPrice: 1234, instantDiscount: 1234, openBoxDiscount: 1234, promotionDiscount: 1234, mailInRebate: 1234, finalPrice: 1234, loan: [], lease: [], promotions: [] }], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 0, canCompare: true } miDevicesObject.sharedService.userService['user'] = userMockData; miDevicesObject.package = packagesData[0]; miDevicesObject.isBYOSOnlyOrder = true; dataStub = fixture.debugElement.injector.get(CartService); TestBed.compileComponents(); TestBed.get(SharedService); TestBed.get(CartService); TestBed.get(UserService); })); // tests here it('should be created', () => { expect(miDevicesObject).toBeTruthy(); }); it('All methods are defined', async(() => { expect(miDevicesObject.addDevice).toBeDefined(); expect(miDevicesObject.updateDevice).toBeDefined(); expect(miDevicesObject.removeDevice).toBeDefined(); expect(miDevicesObject.applyCustomSorting).toBeDefined(); expect(miDevicesObject.setPage).toBeDefined(); expect(miDevicesObject.expandDetails).toBeDefined(); expect(miDevicesObject.updateCompareProducts).toBeDefined(); })); it('should Change the state of the button if there is no device', fakeAsync(() => { miDevicesObject.disableAddToCart = false; miDevicesObject.financeType = 'loan'; miDevicesObject.package = null; expect(miDevicesObject.buttonState(miDevicesObject['deviceItem'][0])).toEqual('ADD'); })); it('should Change the state of the button if there is a device', fakeAsync(() => { miDevicesObject.disableAddToCart = false; miDevicesObject.financeType = 'loan'; miDevicesObject.package = packagesData[0]; expect(miDevicesObject.buttonState(miDevicesObject['deviceItem'][0])).toEqual('UPD'); })); it('should Change the state of the button for a device that is added to the cart', fakeAsync(() => { miDevicesObject.disableAddToCart = false; miDevicesObject.financeType = 'frp'; miDevicesObject.package = packagesData[0]; expect(miDevicesObject.buttonState(miDevicesObject['deviceItem'][0])).toEqual('REM'); })); it('should expand Details if it is not opened yet', fakeAsync(() => { miDevicesObject.expandedProductId = null; miDevicesObject.expandDetails(12345); expect(miDevicesObject.expandedProductId).toEqual(12345); })); it('should expand Details if it is opened', fakeAsync(() => { miDevicesObject.expandedProductId = 12345; miDevicesObject.expandDetails(12345); expect(miDevicesObject.expandedProductId).toEqual(null); })); it('should disable the compare checkbox if already 5 devices are checked', fakeAsync(() => { let device = { productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', description: 'string', manufacturer: 'Apple', descriptions: [], // soc: 'string', items: miDevicesObject['deviceItem'], startDate: '04/12/2017', newPHPSOC: 'string', endDate: '04/12/2017', itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }; miDevicesObject.compareProducts = [{ productId: 12345, productType: 'string', categoryId: 12345, startDate: '04/12/2017', manufacturer: 'Apple', descriptions: [], endDate: '04/12/2017', categoryName: 'string', name: 'string', description: 'string', newPHPSOC: 'string', // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }, { productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', manufacturer: 'Apple', description: 'string', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', newPHPSOC: 'string', // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }, { productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', manufacturer: 'Apple', description: 'string', newPHPSOC: 'string', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }, { productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', startDate: '04/12/2017', manufacturer: 'Apple', endDate: '04/12/2017', newPHPSOC: 'string', description: 'string', descriptions: [], // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }, { productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', manufacturer: 'Apple', startDate: '04/12/2017', endDate: '04/12/2017', description: 'string', newPHPSOC: 'string', descriptions: [], // soc: 'string', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }]; expect(miDevicesObject.disableCompare(device)).toBeTruthy(); })); it('should be enabled the compare checkbox if compare array have less than 5 devices', fakeAsync(() => { let device = { productId: 12345, productType: 'string', categoryId: 12345, manufacturer: 'Apple', categoryName: 'string', name: 'string', description: 'string', descriptions: [], // soc: 'string', items: miDevicesObject['deviceItem'], startDate: '04/12/2017', newPHPSOC: 'string', endDate: '04/12/2017', itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: false }; miDevicesObject.compareProducts = [{ productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', manufacturer: 'Apple', description: 'string', descriptions: [], newPHPSOC: 'string', // soc: 'string', startDate: '04/12/2017', endDate: '04/12/2017', items: miDevicesObject['deviceItem'], itemList: miDevicesObject['deviceItem'], // local veriable for angualr2 itemIndex: 12345, canCompare: true }]; expect(miDevicesObject.disableCompare(device)).toBeFalsy(); })); it('Clearing all filters functionality is working fine', async(() => { miDevicesObject['filters'] = [{ type: 'mi-device', items: [{ name: 'string', productIds: [1234, 1002, 1003], // for local isChecked: true, }] }, { type: 'mi-device', items: [{ name: 'strings', productIds: [2001, 2002, 2003], // for local isChecked: false, }] }]; miDevicesObject['cart'] = cartData; miDevicesObject.sortByOptions = SORT_BY_OPTIONS; miDevicesObject.clearAllFilters(); expect(miDevicesObject.searchText).toEqual(''); expect(miDevicesObject.financeType).toEqual('FRP'); })); it('Checking if atleast one feature is checked for comparison ', async(() => { let totalcheckedCount = miDevicesObject.atleastOneChecked(); expect(totalcheckedCount).toBeTruthy(); })); it('total number of pages are set correctly', fakeAsync(() => { miDevicesObject.pager = { 'totalPages': 10, 'startIndex': 1, 'endIndex': 2 } miDevicesObject.allItems = ['orderItems', 'orderStatus'] miDevicesObject.setPage(2); expect(miDevicesObject.pagedItems.length).toEqual(0); })); it('Should do custom sorting', () => { miDevicesObject.isBYOSOnlyOrder = true; miDevicesObject.applyCustomSorting(); expect(miDevicesObject.allItems[0].productId).toEqual(miDevicesObject.devices[0].productId); }); it('Inventory Status is retrieved correctly', async(() => { const status = miDevicesObject.getInventoryStatus('INS'); expect(status).toEqual('In Stock'); })); it('should Add Device', fakeAsync(() => { const spy = spyOn(dataStub, 'createDevice').and.returnValue( Observable.of(cartData) ); const deviceData = [{ productId: 12345, productType: 'string', categoryId: 12345, categoryName: 'string', name: 'string', manufacturer: 'Apple', description: 'string', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', items: deviceItem, itemList: deviceItem, newPHPSOC: 'string', // local veriable for angualr2 itemIndex: 0, canCompare: true }] miDevicesObject.storeId = 10553; miDevicesObject.addDevice(deviceData[0]); expect(miDevicesObject.cart).toEqual(cartData); })); it('should resolve addItemPreprocess test data', fakeAsync(() => { const spy = spyOn(dataStub, 'createCartDetails').and.returnValue( Observable.of(cartData) ); miDevicesObject.addItemPreprocess(devicesItem); expect(miDevicesObject.cart).toEqual(cartData); })); it('Should update active package', () => { miDevicesObject.customer = customerSearchResponse; spyOn(miDevicesObject.sharedService, 'showErrorMessage'); spyOn(miDevicesObject, 'applyCustomSorting'); miDevicesObject.updateActivePackage(); expect(miDevicesObject.applyCustomSorting).toHaveBeenCalled(); }); it('selectSuggestionItem is working correctly', () => { const item = 'test'; spyOn(miDevicesObject, 'applyCustomSorting') miDevicesObject.selectSuggestionItem(item); expect(miDevicesObject.applyCustomSorting).toHaveBeenCalled(); }); it('should Update Device', fakeAsync(() => { const spy = spyOn(dataStub, 'updateDevice').and.returnValue( Observable.of(cartData) ); miDevicesObject.storeId = 10553; miDevicesObject.updateDevice(deviceDataNonIsByos); expect(miDevicesObject.cart).toEqual(cartData); })); /* it('should remove Device', fakeAsync(() => { const spy = spyOn(dataStub, 'deleteDevice').and.returnValue( Observable.of(cartData) ); miDevicesObject.storeId = 10553; miDevicesObject.cartService.cart = cartData; miDevicesObject.removeDevice(deviceData[0]); expect(miDevicesObject.cart).toEqual(cartData); })); */ it('Should update compare products', () => { const product = { productId: 1234, productType: 'string', categoryId: 1234, categoryName: 'string', name: 'string', description: 'string', manufacturer: 'Apple', descriptions: [], startDate: '04/12/2017', endDate: '04/12/2017', items: [], newPHPSOC: 'string', itemList: [], // local veriable for angualr2 itemIndex: 1, canCompare: true } miDevicesObject.updateCompareProducts(true, product); expect(miDevicesObject.compareProducts[0]).toEqual(product); }); it('Should reset device filters', () => { miDevicesObject.filters = [{ type: 'Manufacturer', items: [{ name: 'string', productIds: [], isChecked: true, }], }]; miDevicesObject.resetDeviceFilters(); expect(miDevicesObject.deviceBrandFilters).toEqual([]); }); it('should resolve device conflicts test data', fakeAsync(() => { const device = { productId: 1234, productType: 'string', categoryId: 1234, categoryName: 'string', name: 'string', manufacturer: 'string', description: 'string', descriptions: [], startDate: 'string', endDate: 'string', newPHPSOC: 'string', items: [ { itemId: 123, name: 'string', description: 'string', deviceSKU: 'string', isByos: false, sim: 'string', thumbNail: 'string', fullImage: 'string', colorName: 'string', colorImageUrl: 'string', isRefurbished: false, status: 'string', shipDateFrom: 'string', shipDateTo: 'string', suggestedPrice: 123, instantDiscount: 123, openBoxDiscount: 123, promotionDiscount: 123, mailInRebate: 123, finalPrice: 123, loan: [], lease: [], promotions: [] }], itemList: [], // local veriable for angualr2 itemIndex: 0, canCompare: false } const cartStub = fixture.debugElement.injector.get(CartService); const spy = spyOn(cartStub, 'deviceFeatureConflicts').and.returnValue( Observable.of(cartData) ); miDevicesObject.checkForDeviceConflicts(device); expect(miDevicesObject.deviceConflicts).toEqual(cartData); })); });