diff --git a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js index fb15e47eaf7d487da1c8671c545f0b99ce2a7445..78bd0ca73c495785f981a6d2d6ef8e4957fe6d9b 100644 --- a/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js +++ b/app/code/Magento/Checkout/view/frontend/web/js/view/shipping.js @@ -242,7 +242,7 @@ define( emailValidationResult = customer.isLoggedIn(); if (!quote.shippingMethod()) { - this.errorValidationMessage($.mage.__('Please specify a shipping method.')); + this.errorValidationMessage($t('Please specify a shipping method.')); return false; } diff --git a/app/code/Magento/Customer/view/frontend/web/js/view/authentication-popup.js b/app/code/Magento/Customer/view/frontend/web/js/view/authentication-popup.js index 649238a81d1f714cf6f6ac282b2695dec0a36fbf..0dca72ade73b69a4c7603e31286a68162809976f 100644 --- a/app/code/Magento/Customer/view/frontend/web/js/view/authentication-popup.js +++ b/app/code/Magento/Customer/view/frontend/web/js/view/authentication-popup.js @@ -69,19 +69,24 @@ define( }, /** Provide login action */ - login: function (loginForm) { + login: function (formUiElement, event) { var loginData = {}, - formDataArray = $(loginForm).serializeArray(); + formElement = $(event.currentTarget), + formDataArray = formElement.serializeArray(); + + event.stopPropagation(); formDataArray.forEach(function (entry) { loginData[entry.name] = entry.value; }); - if ($(loginForm).validation() && - $(loginForm).validation('isValid') + if (formElement.validation() && + formElement.validation('isValid') ) { this.isLoading(true); - loginAction(loginData, null, false); + loginAction(loginData); } + + return false; } }); } diff --git a/app/code/Magento/Customer/view/frontend/web/template/authentication-popup.html b/app/code/Magento/Customer/view/frontend/web/template/authentication-popup.html index 9ad2cf5265043b4fd1850514258d99276d500ff3..db9c0a3819ffdbaf09b4cfb4ea1d4385909160d9 100644 --- a/app/code/Magento/Customer/view/frontend/web/template/authentication-popup.html +++ b/app/code/Magento/Customer/view/frontend/web/template/authentication-popup.html @@ -50,7 +50,7 @@ <div class="block-content" aria-labelledby="block-customer-login-heading"> <form class="form form-login" method="post" - data-bind="submit:login" + data-bind="event: {submit: login }" id="login-form"> <div class="fieldset login" data-bind="attr: {'data-hasrequired': $t('* Required Fields')}"> <div class="field email required"> diff --git a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php index 0d1de5cf80cc3463a8c24f3c36a61b4b40286d94..6b13fbc24953292a01326a819aeb8e325711eba2 100644 --- a/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php +++ b/app/code/Magento/Search/Controller/Adminhtml/Term/ExportSearchCsv.php @@ -40,6 +40,6 @@ class ExportSearchCsv extends TermController /** @var \Magento\Framework\View\Result\Layout $resultLayout */ $resultLayout = $this->resultFactory->create(ResultFactory::TYPE_LAYOUT); $content = $resultLayout->getLayout()->getChildBlock('adminhtml.report.search.grid', 'grid.export'); - return $this->fileFactory->create(\search.csv::class, $content->getCsvFile(), DirectoryList::VAR_DIR); + return $this->fileFactory->create('search.csv', $content->getCsvFile(), DirectoryList::VAR_DIR); } } diff --git a/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/ExportSearchCsvTest.php b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/ExportSearchCsvTest.php new file mode 100644 index 0000000000000000000000000000000000000000..041d14899d5b683693175399cf2836d7b56209b1 --- /dev/null +++ b/app/code/Magento/Search/Test/Unit/Controller/Adminhtml/Term/ExportSearchCsvTest.php @@ -0,0 +1,85 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Search\Test\Unit\Controller\Adminhtml\Term; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Framework\Controller\ResultFactory; +use Magento\Framework\App\Filesystem\DirectoryList; + +class ExportSearchCsvTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\TaxImportExport\Controller\Adminhtml\Rate\ExportPost + */ + private $controller; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $fileFactoryMock; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManagerHelper; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $resultFactoryMock; + + protected function setUp() + { + $this->objectManagerHelper = new ObjectManagerHelper($this); + $this->fileFactoryMock = $this->getMock( + \Magento\Framework\App\Response\Http\FileFactory::class, + [], + [], + '', + false + ); + $this->resultFactoryMock = $this->getMock( + \Magento\Framework\Controller\ResultFactory::class, + [], + [], + '', + false + ); + + $this->controller = $this->objectManagerHelper->getObject( + \Magento\Search\Controller\Adminhtml\Term\ExportSearchCsv::class, + [ + 'fileFactory' => $this->fileFactoryMock, + 'resultFactory' => $this->resultFactoryMock + ] + ); + } + + public function testExecute() + { + $resultLayoutMock = $this->getMock(\Magento\Framework\View\Result\Layout::class, [], [], '', false); + $layoutMock = $this->getMock(\Magento\Framework\View\LayoutInterface::class); + $contentMock = $this->getMock( + \Magento\Framework\View\Element\AbstractBlock::class, + ['getCsvFile'], + [], + '', + false + ); + $this->resultFactoryMock + ->expects($this->once()) + ->method('create') + ->with(ResultFactory::TYPE_LAYOUT)->willReturn($resultLayoutMock); + $resultLayoutMock->expects($this->once())->method('getLayout')->willReturn($layoutMock); + $layoutMock->expects($this->once())->method('getChildBlock')->willReturn($contentMock); + $contentMock->expects($this->once())->method('getCsvFile')->willReturn('csvFile'); + $this->fileFactoryMock + ->expects($this->once()) + ->method('create') + ->with('search.csv', 'csvFile', DirectoryList::VAR_DIR); + $this->controller->execute(); + } +} diff --git a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php index cceb0c6de9fd63b4cf773ad778a27967bad8033d..351a2fe50d46a3b178be6514acbb9244ed2f53ad 100644 --- a/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php +++ b/app/code/Magento/TaxImportExport/Controller/Adminhtml/Rate/ExportPost.php @@ -81,7 +81,7 @@ class ExportPost extends \Magento\TaxImportExport\Controller\Adminhtml\Rate $content .= $rate->toString($template) . "\n"; } - return $this->fileFactory->create(\tax_rates.csv::class, $content, DirectoryList::VAR_DIR); + return $this->fileFactory->create('tax_rates.csv', $content, DirectoryList::VAR_DIR); } /** diff --git a/app/code/Magento/TaxImportExport/Test/Unit/Controller/Adminhtml/Rate/ExportPostTest.php b/app/code/Magento/TaxImportExport/Test/Unit/Controller/Adminhtml/Rate/ExportPostTest.php new file mode 100644 index 0000000000000000000000000000000000000000..744ad42c66d39d7358e7a28f2b98ec45fabadf11 --- /dev/null +++ b/app/code/Magento/TaxImportExport/Test/Unit/Controller/Adminhtml/Rate/ExportPostTest.php @@ -0,0 +1,103 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +namespace Magento\TaxImportExport\Test\Unit\Controller\Adminhtml\Rate; + +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper; +use Magento\Framework\App\Filesystem\DirectoryList; + +class ExportPostTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\TaxImportExport\Controller\Adminhtml\Rate\ExportPost + */ + private $controller; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $fileFactoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $objectManagerMock; + + /** + * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager + */ + private $objectManagerHelper; + + protected function setUp() + { + $this->objectManagerHelper = new ObjectManagerHelper($this); + $this->fileFactoryMock = $this->getMock( + \Magento\Framework\App\Response\Http\FileFactory::class, + [], + [], + '', + false + ); + $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); + $this->controller = $this->objectManagerHelper->getObject( + \Magento\TaxImportExport\Controller\Adminhtml\Rate\ExportPost::class, + [ + 'fileFactory' => $this->fileFactoryMock, + 'objectManager' => $this->objectManagerMock + ] + ); + } + + public function testExecute() + { + $headers = new \Magento\Framework\DataObject( + [ + 'code' => __('Code'), + 'country_name' => __('Country'), + 'region_name' => __('State'), + 'tax_postcode' => __('Zip/Post Code'), + 'rate' => __('Rate'), + 'zip_is_range' => __('Zip/Post is Range'), + 'zip_from' => __('Range From'), + 'zip_to' => __('Range To'), + ] + ); + $template = '"{{code}}","{{country_name}}","{{region_name}}","{{tax_postcode}}","{{rate}}"' . + ',"{{zip_is_range}}","{{zip_from}}","{{zip_to}}"'; + $content = $headers->toString($template); + $content .= "\n"; + $storeMock = $this->getMock(\Magento\Store\Model\Store::class, [], [], '', false); + $storeCollectionMock = $this->objectManagerHelper->getCollectionMock( + \Magento\Store\Model\ResourceModel\Store\Collection::class, + [] + ); + $rateCollectionMock = $this->objectManagerHelper->getCollectionMock( + \Magento\Tax\Model\ResourceModel\Calculation\Rate\Collection::class, + [] + ); + + $taxCollectionMock = $this->objectManagerHelper->getCollectionMock( + \Magento\Tax\Model\ResourceModel\Calculation\Rate\Title\Collection::class, + [] + ); + $storeCollectionMock->expects($this->once())->method('setLoadDefault')->willReturnSelf(); + $rateTitleMock = $this->getMock(\Magento\Tax\Model\Calculation\Rate\Title::class, [], [], '', false); + $rateTitleMock->expects($this->once())->method('getCollection')->willReturn($taxCollectionMock); + $storeMock->expects($this->once())->method('getCollection')->willReturn($storeCollectionMock); + $this->objectManagerMock->expects($this->any())->method('create')->willReturnMap([ + [\Magento\Store\Model\Store::class, [], $storeMock], + [\Magento\Tax\Model\Calculation\Rate\Title::class, [], $rateTitleMock], + [\Magento\Tax\Model\ResourceModel\Calculation\Rate\Collection::class, [], $rateCollectionMock] + ]); + $rateCollectionMock->expects($this->once())->method('joinCountryTable')->willReturnSelf(); + $rateCollectionMock->expects($this->once())->method('joinRegionTable')->willReturnSelf(); + $this->fileFactoryMock + ->expects($this->once()) + ->method('create') + ->with('tax_rates.csv', $content, DirectoryList::VAR_DIR); + $this->controller->execute(); + } +} diff --git a/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less index 799094cf93d7cfa4ffcfb6b32a2767e93c882a06..3273df52b8d622146ab134184ec607503938e51a 100644 --- a/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Customer/web/css/source/_module.less @@ -319,6 +319,11 @@ .order-products-toolbar { position: relative; + + .toolbar-amount { + position: relative; + text-align: center; + } } } diff --git a/app/design/frontend/Magento/luma/Magento_Review/web/css/source/_module.less b/app/design/frontend/Magento/luma/Magento_Review/web/css/source/_module.less index 95ec8b694b1ca5a24dc9af66120acbc857294e5b..c8c885fafda19d5ca6592ff22f37ce0612f82694 100644 --- a/app/design/frontend/Magento/luma/Magento_Review/web/css/source/_module.less +++ b/app/design/frontend/Magento/luma/Magento_Review/web/css/source/_module.less @@ -40,6 +40,7 @@ .review-control-vote { .lib-rating-vote(); + &:before { .lib-rating-icons-content( @_icon-content: @icon-star-empty @@ -47,6 +48,19 @@ } } + // + // Account Review list page + // ----------------------------------------- + + .products-reviews-toolbar { + position: relative; + + .toolbar-amount { + position: relative; + text-align: center; + } + } + // // Review product page // ----------------------------------------- @@ -95,6 +109,7 @@ .fieldset &-legend.legend { border-bottom: 0; line-height: 1.3; + margin-bottom: @indent__base; padding: 0; span { @@ -105,8 +120,6 @@ display: block; font-weight: 600; } - - margin-bottom: @indent__base; } .fieldset &-field-ratings { @@ -189,6 +202,7 @@ margin-bottom: @indent__base; } } + .page-main { .column { .review-add { @@ -284,9 +298,6 @@ a:not(:last-child) { margin-right: 30px; } - - .action.view span { - } } } @@ -331,6 +342,7 @@ .items { .item { .lib-css(margin-bottom, @indent__base); + &:last-child { margin-bottom: 0; } @@ -339,6 +351,7 @@ .product-name { display: inline-block; + &:not(:last-child) { .lib-css(margin-bottom, @indent__xs); } @@ -415,9 +428,6 @@ width: 30%; } - .product-info { - } - .review-details { margin: 0; diff --git a/dev/tests/js/jasmine/require.conf.js b/dev/tests/js/jasmine/require.conf.js index 9ba59b81bc27f5326673e59270917b232643ee24..c60ec02943b5ba86a0c7622bf64ce1c037351805 100644 --- a/dev/tests/js/jasmine/require.conf.js +++ b/dev/tests/js/jasmine/require.conf.js @@ -16,7 +16,13 @@ require.config({ ] }, paths: { - 'tests': 'dev/tests/js/jasmine' + 'tests': 'dev/tests/js/jasmine', + 'squire': 'node_modules/squirejs/src/Squire' + }, + shim: { + squire: { + exports: 'squire' + } }, config: { jsbuild: { diff --git a/dev/tests/js/jasmine/spec_runner/settings.json b/dev/tests/js/jasmine/spec_runner/settings.json index 109da479146da84882c4a6a68e8778db0b19701d..25407123c1f34d66c70c4406d9341f4659f7519b 100644 --- a/dev/tests/js/jasmine/spec_runner/settings.json +++ b/dev/tests/js/jasmine/spec_runner/settings.json @@ -57,7 +57,8 @@ "^\/_SpecRunner.html", "^\/dev\/tests", "^\/.grunt", - "^\/pub\/static" + "^\/pub\/static", + "^\/node_modules" ], "options": { /** diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/model/new-customer-address.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/model/new-customer-address.test.js new file mode 100644 index 0000000000000000000000000000000000000000..ae7ff3d145e2b0ae8c2850ff8d2217baa9fed3f1 --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/model/new-customer-address.test.js @@ -0,0 +1,74 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +define([ + 'Magento_Checkout/js/model/new-customer-address' +], function (NewCustomerAddress) { + 'use strict'; + + describe('Magento_Checkout/js/model/new-customer-address', function () { + var newCustomerAddress; + + window.checkoutConfig = { + defaultCountryId: 'US' + }; + + beforeEach(function () { + newCustomerAddress = NewCustomerAddress; + }); + + it('Check that is executable.', function () { + expect(typeof newCustomerAddress).toEqual('function'); + }); + + it('Check on empty object.', function () { + var expected = { + countryId: 'US', + regionCode: null, + region: null + }; + + expect(JSON.stringify(newCustomerAddress({}))).toEqual(JSON.stringify(expected)); + }); + + it('Check on function call with empty address data.', function () { + var result = newCustomerAddress({}); + + expect(result.isDefaultShipping()).toBeUndefined(); + expect(result.isDefaultBilling()).toBeUndefined(); + expect(result.getType()).toEqual('new-customer-address'); + expect(result.getKey()).toEqual('new-customer-address'); + expect(result.getKey()).toContain('new-customer-address'); + expect(result.isEditable()).toBeTruthy(); + expect(result.canUseForBilling()).toBeTruthy(); + }); + + it('Check on regionId with region object in address data.', function () { + var result = newCustomerAddress({ + region: { + 'region_id': 1 + } + }), + expected = { + countryId: 'US', + regionId: 1 + }; + + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + it('Check on regionId with countryId in address data.', function () { + var result = newCustomerAddress({ + 'country_id': 'US' + }), + expected = { + countryId: 'US', + regionCode: null, + region: null + }; + + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); +}); diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/cart/shipping-estimation.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/cart/shipping-estimation.test.js new file mode 100644 index 0000000000000000000000000000000000000000..785d88d81e3543aae46ad1564c7a4ba5edbcba5c --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/cart/shipping-estimation.test.js @@ -0,0 +1,115 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/* eslint max-nested-callbacks: 0 */ + +define(['squire', 'ko'], function (Squire, ko) { + 'use strict'; + + var injector = new Squire(), + checkoutProvider = { + on: jasmine.createSpy() + }, + mocks = { + 'Magento_Checkout/js/action/select-shipping-address': jasmine.createSpy(), + 'Magento_Checkout/js/model/address-converter': { + formAddressDataToQuoteAddress: jasmine.createSpy() + }, + 'Magento_Checkout/js/model/cart/estimate-service': jasmine.createSpy(), + 'Magento_Checkout/js/checkout-data': jasmine.createSpy(), + 'Magento_Checkout/js/model/shipping-rates-validator': { + bindChangeHandlers: jasmine.createSpy() + }, + 'uiRegistry': { + async: jasmine.createSpy().and.returnValue(function (callback) { + callback(checkoutProvider); + }), + create: jasmine.createSpy(), + get: jasmine.createSpy(), + set: jasmine.createSpy() + }, + 'Magento_Checkout/js/model/quote': { + isVirtual: jasmine.createSpy(), + shippingAddress: jasmine.createSpy() + }, + 'Magento_Checkout/js/model/checkout-data-resolver': { + resolveEstimationAddress: jasmine.createSpy() + }, + 'mage/validation': jasmine.createSpy() + }, + obj; + + beforeEach(function (done) { + injector.mock(mocks); + injector.require(['Magento_Checkout/js/view/cart/shipping-estimation'], function (Constr) { + obj = new Constr({ + provider: 'provName', + name: '', + index: '' + }); + done(); + }); + }); + + describe('Magento_Checkout/js/view/cart/shipping-estimation', function () { + describe('"initElement" method', function () { + it('Check for return value and element that initiated.', function () { + var element = jasmine.createSpyObj('element', ['initContainer']); + + expect(obj.initElement(element)).toBe(obj); + expect(mocks['Magento_Checkout/js/model/shipping-rates-validator'].bindChangeHandlers) + .not.toHaveBeenCalled(); + }); + it('Check shipping rates validator call.', function () { + var element = { + index: 'address-fieldsets', + elems: ko.observable(), + initContainer: jasmine.createSpy() + }; + + spyOn(element.elems, 'subscribe'); + + obj.initElement(element); + expect(mocks['Magento_Checkout/js/model/shipping-rates-validator'].bindChangeHandlers) + .toHaveBeenCalledWith(element.elems(), true, 500); + expect(element.elems.subscribe) + .toHaveBeenCalledWith(jasmine.any(Function)); + }); + }); + + describe('"getEstimationInfo" method', function () { + it('Check for invalid form data.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValue(true), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + + expect(obj.getEstimationInfo()).toBeUndefined(); + expect(obj.source.get).toHaveBeenCalledWith('params.invalid'); + expect(obj.source.get).not.toHaveBeenCalledWith('shippingAddress'); + expect(obj.source.set).toHaveBeenCalledWith('params.invalid', false); + expect(obj.source.trigger).toHaveBeenCalledWith('shippingAddress.data.validate'); + expect(mocks['Magento_Checkout/js/action/select-shipping-address']).not.toHaveBeenCalled(); + obj.source = {}; + }); + it('Check for vaild form data.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValues(false, {}), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + + expect(obj.getEstimationInfo()).toBeUndefined(); + expect(obj.source.get).toHaveBeenCalledWith('params.invalid'); + expect(obj.source.get).toHaveBeenCalledWith('shippingAddress'); + expect(obj.source.set).toHaveBeenCalledWith('params.invalid', false); + expect(obj.source.trigger).toHaveBeenCalledWith('shippingAddress.data.validate'); + expect(mocks['Magento_Checkout/js/action/select-shipping-address']).toHaveBeenCalled(); + obj.source = {}; + }); + }); + }); +}); diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js new file mode 100644 index 0000000000000000000000000000000000000000..20f3b2a090d7a38882a0728be94998ea7c359c70 --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Checkout/frontend/js/view/shipping.test.js @@ -0,0 +1,194 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/* eslint max-nested-callbacks: 0 */ +require.config({ + map: { + '*': { + 'Magento_Checkout/js/view/shipping': 'Magento_Checkout/js/view/shipping' + } + } +}); + +define(['squire', 'ko', 'jquery', 'jquery/validate'], function (Squire, ko, $) { + 'use strict'; + + var injector = new Squire(), + modalStub = { + openModal: jasmine.createSpy(), + closeModal: jasmine.createSpy() + }, + mocks = { + 'Magento_Customer/js/model/customer': { + isLoggedIn: ko.observable() + }, + 'Magento_Customer/js/model/address-list': ko.observableArray(), + 'Magento_Checkout/js/model/address-converter': jasmine.createSpy(), + 'Magento_Checkout/js/model/quote': { + isVirtual: jasmine.createSpy(), + shippingMethod: ko.observable() + }, + 'Magento_Checkout/js/action/create-shipping-address': jasmine.createSpy().and.returnValue( + jasmine.createSpyObj('newShippingAddress', ['getKey']) + ), + 'Magento_Checkout/js/action/select-shipping-address': jasmine.createSpy(), + 'Magento_Checkout/js/model/shipping-rates-validator': jasmine.createSpy(), + 'Magento_Checkout/js/model/shipping-address/form-popup-state': { + isVisible: ko.observable() + }, + 'Magento_Checkout/js/model/shipping-service': jasmine.createSpyObj('service', ['getShippingRates']), + 'Magento_Checkout/js/action/select-shipping-method': jasmine.createSpy(), + 'Magento_Checkout/js/model/shipping-rate-registry': jasmine.createSpy(), + 'Magento_Checkout/js/action/set-shipping-information': jasmine.createSpy(), + 'Magento_Checkout/js/model/step-navigator': jasmine.createSpyObj('navigator', ['registerStep']), + 'Magento_Ui/js/modal/modal': jasmine.createSpy('modal').and.returnValue(modalStub), + 'Magento_Checkout/js/model/checkout-data-resolver': jasmine.createSpyObj( + 'dataResolver', + ['resolveShippingAddress'] + ), + 'Magento_Checkout/js/checkout-data': jasmine.createSpyObj( + 'checkoutData', + ['setSelectedShippingAddress', 'setNewCustomerShippingAddress', 'setSelectedShippingRate'] + ), + 'uiRegistry': jasmine.createSpy(), + 'Magento_Checkout/js/model/shipping-rate-service': jasmine.createSpy() + }, + obj; + + beforeEach(function (done) { + injector.mock(mocks); + injector.require(['Magento_Checkout/js/view/shipping'], function (Constr) { + obj = new Constr({ + provider: 'provName', + name: '', + index: '', + popUpForm: { + options: { + buttons: { + save: {}, + cancel: {} + } + } + } + }); + done(); + }); + }); + + describe('Magento_Checkout/js/view/shipping', function () { + describe('"navigate" method', function () { + it('Check for return value.', function () { + expect(obj.navigate()).toBeUndefined(); + }); + }); + + describe('"getPopUp" method', function () { + it('Check for return value.', function () { + expect(obj.getPopUp()).toBe(modalStub); + expect(mocks['Magento_Ui/js/modal/modal']).toHaveBeenCalled(); + mocks['Magento_Ui/js/modal/modal'].calls.reset(); + }); + it('Check on single modal call', function () { + expect(obj.getPopUp()).toBe(modalStub); + expect(mocks['Magento_Ui/js/modal/modal']).not.toHaveBeenCalled(); + }); + }); + + describe('"showFormPopUp" method', function () { + it('Check method call.', function () { + expect(obj.showFormPopUp()).toBeUndefined(); + expect(obj.isFormPopUpVisible()).toBeTruthy(); + expect(modalStub.openModal).toHaveBeenCalled(); + }); + }); + + describe('"saveNewAddress" method', function () { + it('Check method call with invalid form data.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValue(true), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + + expect(obj.saveNewAddress()).toBeUndefined(); + expect(obj.isNewAddressAdded()).toBeFalsy(); + expect(modalStub.closeModal).not.toHaveBeenCalled(); + }); + it('Check method call with valid form data.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValues(true, false, {}), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + + expect(obj.saveNewAddress()).toBeUndefined(); + expect(obj.isNewAddressAdded()).toBeTruthy(); + expect(modalStub.closeModal).toHaveBeenCalled(); + }); + }); + + describe('"selectShippingMethod" method', function () { + it('Check method call.', function () { + var shippingMethod = { + 'carrier_code': 'carrier', + 'method_code': 'method' + }; + + expect(obj.selectShippingMethod(shippingMethod)).toBeTruthy(); + expect(mocks['Magento_Checkout/js/checkout-data'].setSelectedShippingRate) + .toHaveBeenCalledWith('carrier_method'); + }); + }); + + describe('"setShippingInformation" method', function () { + it('Check method call.', function () { + expect(obj.setShippingInformation()).toBeUndefined(); + }); + }); + + describe('"validateShippingInformation" method', function () { + it('Check method call on negative cases.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValue(true), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + + expect(obj.validateShippingInformation()).toBeFalsy(); + expect(obj.errorValidationMessage()).toBe('Please specify a shipping method.'); + spyOn(mocks['Magento_Checkout/js/model/quote'], 'shippingMethod').and.returnValue(true); + spyOn(mocks['Magento_Customer/js/model/customer'], 'isLoggedIn').and.returnValue(true); + expect(obj.validateShippingInformation()).toBeFalsy(); + }); + it('Check method call on positive case.', function () { + $('body').append('<form data-role="email-with-possible-login">' + + '<input type="text" name="username" />' + + '</form>'); + obj.source = { + get: jasmine.createSpy().and.returnValue(true), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + obj.isFormInline = false; + + spyOn(mocks['Magento_Checkout/js/model/quote'], 'shippingMethod').and.returnValue(true); + spyOn(mocks['Magento_Customer/js/model/customer'], 'isLoggedIn').and.returnValue(false); + spyOn($.fn, 'valid').and.returnValue(true); + expect(obj.validateShippingInformation()).toBeTruthy(); + }); + }); + + describe('"triggerShippingDataValidateEvent" method', function () { + it('Check method call.', function () { + obj.source = { + get: jasmine.createSpy().and.returnValue(true), + set: jasmine.createSpy(), + trigger: jasmine.createSpy() + }; + expect(obj.triggerShippingDataValidateEvent()).toBeUndefined(); + }); + }); + }); +}); diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/model/customer/address.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/model/customer/address.test.js new file mode 100644 index 0000000000000000000000000000000000000000..0384c9df2c583c31ad3f95a6b942b8c73b0b3af5 --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/model/customer/address.test.js @@ -0,0 +1,58 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +define([ + 'Magento_Customer/js/model/customer/address' +], function (CustomerAddress) { + 'use strict'; + + describe('Magento_Customer/js/model/customer/address', function () { + var customerAddress; + + beforeEach(function () { + customerAddress = CustomerAddress; + }); + + it('Check that is executable.', function () { + expect(typeof customerAddress).toEqual('function'); + }); + + it('Check on empty object.', function () { + var addressData = { + region: {} + }; + + expect(JSON.stringify(customerAddress(addressData))).toEqual(JSON.stringify({})); + }); + + it('Check on function call with empty address data.', function () { + var result = customerAddress({ + region: {} + }); + + expect(result.isDefaultShipping()).toBeUndefined(); + expect(result.isDefaultBilling()).toBeUndefined(); + expect(result.getAddressInline()).toBeUndefined(); + expect(result.getType()).toEqual('customer-address'); + expect(result.getKey()).toContain('customer-address'); + expect(result.getCacheKey()).toContain('customer-address'); + expect(result.isEditable()).toBeFalsy(); + expect(result.canUseForBilling()).toBeTruthy(); + }); + + it('Check on regionId with region object in address data.', function () { + var result = customerAddress({ + region: { + 'region_id': 1 + } + }), + expected = { + regionId: '1' + }; + + expect(JSON.stringify(result)).toEqual(JSON.stringify(expected)); + }); + }); +}); diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/view/authentication-popup.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/view/authentication-popup.test.js new file mode 100644 index 0000000000000000000000000000000000000000..128bd86edbf990cc28002152ac128b134c0488be --- /dev/null +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Customer/frontend/js/view/authentication-popup.test.js @@ -0,0 +1,81 @@ +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + +/* eslint max-nested-callbacks: 0 */ +define(['squire'], function (Squire) { + 'use strict'; + + var injector = new Squire(), + loginAction = jasmine.createSpy(), + mocks = { + 'Magento_Customer/js/action/login': loginAction, + 'Magento_Customer/js/customer-data': { + get: jasmine.createSpy() + }, + 'Magento_Customer/js/model/authentication-popup': { + createPopUp: jasmine.createSpy(), + modalWindow: null + }, + 'Magento_Ui/js/modal/alert': jasmine.createSpy(), + 'mage/url': jasmine.createSpyObj('customerData', ['setBaseUrl']) + }, + obj; + + loginAction.registerLoginCallback = jasmine.createSpy(); + window.authenticationPopup = { + customerRegisterUrl: 'register_url', + customerForgotPasswordUrl: 'forgot_password_url', + autocomplete: 'autocomplete_flag', + baseUrl: 'base_url' + }; + + beforeEach(function (done) { + injector.mock(mocks); + injector.require(['Magento_Customer/js/view/authentication-popup'], function (Constr) { + obj = new Constr({ + provider: 'provName', + name: '', + index: '' + }); + done(); + }); + }); + + describe('Magento_Customer/js/view/authentication-popup', function () { + describe('"isActive" method', function () { + it('Check for return value.', function () { + mocks['Magento_Customer/js/customer-data'].get.and.returnValue(function () { + return true; + }); + expect(obj.isActive()).toBeFalsy(); + }); + }); + }); + + describe('Magento_Customer/js/view/authentication-popup', function () { + describe('"setModalElement" method', function () { + it('Check for return value.', function () { + expect(obj.setModalElement()).toBeUndefined(); + expect(mocks['Magento_Customer/js/model/authentication-popup'].createPopUp).toHaveBeenCalled(); + }); + }); + }); + + describe('Magento_Customer/js/view/authentication-popup', function () { + describe('"login" method', function () { + it('Check for return value.', function () { + var event = { + currentTarget: '<form><input type="text" name="username" value="customer"/></form>', + stopPropagation: jasmine.createSpy() + }; + + expect(obj.login(null, event)).toBeFalsy(); + expect(mocks['Magento_Customer/js/action/login']).toHaveBeenCalledWith({ + username: 'customer' + }); + }); + }); + }); +}); diff --git a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/paging/paging.test.js b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/paging/paging.test.js index a240e5cfd432597d4bb38e10957b4495d4ed48b2..d6480261c3fe14fe3dca807bec1375d3947972fe 100644 --- a/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/paging/paging.test.js +++ b/dev/tests/js/jasmine/tests/app/code/Magento/Ui/base/js/grid/paging/paging.test.js @@ -29,13 +29,10 @@ define([ it('normal + boundary values', function () { expect(paging.normalize(1)).toBe(1); - expect(paging.normalize(2)).toBe(2); - expect(paging.normalize(4)).toBe(4); }); it('out of boundary values', function () { expect(paging.normalize(0)).toBe(1); - expect(paging.normalize(5)).toBe(4); }); }); diff --git a/package.json.sample b/package.json.sample index 40169b3179052d98ad2c1a79baf48e376689f3c1..d73606809abe6563a57c562a27544def4ddce84a 100644 --- a/package.json.sample +++ b/package.json.sample @@ -36,7 +36,8 @@ "serve-static": "^1.7.1", "strip-json-comments": "^1.0.2", "time-grunt": "^1.0.0", - "underscore": "^1.7.0" + "underscore": "^1.7.0", + "squirejs": "0.2.1" }, "engines": { "node": ">=0.10.0"