de.hybris.platform.commercefacades.customer.impl.DefaultCustomerFacadeTest.java Source code

Java tutorial

Introduction

Here is the source code for de.hybris.platform.commercefacades.customer.impl.DefaultCustomerFacadeTest.java

Source

/*
 * [y] hybris Platform
 *
 * Copyright (c) 2000-2014 hybris AG
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of hybris
 * ("Confidential Information"). You shall not disclose such Confidential
 * Information and shall use it only in accordance with the terms of the
 * license agreement you entered into with hybris.
 *
 *  
 */
package de.hybris.platform.commercefacades.customer.impl;

import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import de.hybris.bootstrap.annotations.UnitTest;
import de.hybris.platform.commercefacades.order.OrderFacade;
import de.hybris.platform.commercefacades.order.data.CCPaymentInfoData;
import de.hybris.platform.commercefacades.storesession.StoreSessionFacade;
import de.hybris.platform.commercefacades.storesession.data.CurrencyData;
import de.hybris.platform.commercefacades.storesession.data.LanguageData;
import de.hybris.platform.commercefacades.user.UserFacade;
import de.hybris.platform.commercefacades.user.converters.populator.AddressReversePopulator;
import de.hybris.platform.commercefacades.user.data.AddressData;
import de.hybris.platform.commercefacades.user.data.CustomerData;
import de.hybris.platform.commercefacades.user.data.RegisterData;
import de.hybris.platform.commerceservices.customer.CustomerAccountService;
import de.hybris.platform.commerceservices.customer.DuplicateUidException;
import de.hybris.platform.commerceservices.customer.PasswordMismatchException;
import de.hybris.platform.commerceservices.customer.TokenInvalidatedException;
import de.hybris.platform.commerceservices.order.CommerceCartService;
import de.hybris.platform.commerceservices.strategies.CustomerNameStrategy;
import de.hybris.platform.commerceservices.strategies.impl.DefaultCustomerNameStrategy;
import de.hybris.platform.converters.impl.AbstractPopulatingConverter;
import de.hybris.platform.core.PK;
import de.hybris.platform.core.model.order.payment.CreditCardPaymentInfoModel;
import de.hybris.platform.core.model.user.AddressModel;
import de.hybris.platform.core.model.user.CustomerModel;
import de.hybris.platform.core.model.user.UserModel;
import de.hybris.platform.order.CartService;
import de.hybris.platform.servicelayer.exceptions.UnknownIdentifierException;
import de.hybris.platform.servicelayer.i18n.CommonI18NService;
import de.hybris.platform.servicelayer.model.ModelService;
import de.hybris.platform.servicelayer.session.SessionService;
import de.hybris.platform.servicelayer.user.UserService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import junit.framework.Assert;

import org.apache.commons.lang.StringUtils;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

/**
 * Test suite for {@link DefaultCustomerFacade}
 */
@UnitTest
public class DefaultCustomerFacadeTest {
    private static final String TEST_DUMMY = "dummy";
    private static final String TEST_OLD_PASS = "oldPass";
    private static final String TEST_NEW_PASS = "newPass";
    private static final String TEST_USER_UID = "testUid";
    private static final String TEST_TOKEN = "token";
    private DefaultCustomerFacade defaultCustomerFacade;

    @Mock
    private UserService userService;
    @Mock
    private UserModel user;
    @Mock
    private CustomerAccountService customerAccountService;
    @Mock
    private ModelService mockModelService;
    @Mock
    private AbstractPopulatingConverter<AddressModel, AddressData> addressConverter;
    @Mock
    private AbstractPopulatingConverter<UserModel, CustomerData> customerConverter;
    @Mock
    private AddressReversePopulator addressReversePopulator;
    @Mock
    private AbstractPopulatingConverter<CreditCardPaymentInfoModel, CCPaymentInfoData> creditCardPaymentInfoConverter;
    @Mock
    private CommonI18NService commonI18NService;
    @Mock
    private StoreSessionFacade storeSessionFacade;
    @Mock
    private CartService cartService;
    @Mock
    private CommerceCartService commerceCartService;
    @Mock
    private UserFacade userFacade;
    @Mock
    private SessionService sessionService;
    @Mock
    private OrderFacade orderFacade;

    private CustomerModel customerModel;

    private CustomerModel guestCustomerModel;

    private AddressModel addressModel;

    private AddressModel addressModel2;

    private AddressData addressData;

    private CreditCardPaymentInfoModel creditCardPaymentInfoModel;

    private CCPaymentInfoData ccPaymentInfoData;

    private CustomerNameStrategy customerNameStrategy;

    private CurrencyData defaultCurrencyData;

    private LanguageData defaultLanguageData;

    protected static class MockAddressModel extends AddressModel {
        private final long id;

        public MockAddressModel(final long id) {
            this.id = id;
        }

        @Override
        public PK getPk() {
            return de.hybris.platform.core.PK.fromLong(id);
        }
    }

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        defaultCustomerFacade = new DefaultCustomerFacade();
        defaultCustomerFacade.setUserService(userService);
        defaultCustomerFacade.setModelService(mockModelService);
        defaultCustomerFacade.setCustomerAccountService(customerAccountService);
        defaultCustomerFacade.setAddressConverter(addressConverter);
        defaultCustomerFacade.setCustomerConverter(customerConverter);
        defaultCustomerFacade.setAddressReversePopulator(addressReversePopulator);
        defaultCustomerFacade.setCreditCardPaymentInfoConverter(creditCardPaymentInfoConverter);
        defaultCustomerFacade.setCommonI18NService(commonI18NService);
        defaultCustomerFacade.setStoreSessionFacade(storeSessionFacade);
        defaultCustomerFacade.setCartService(cartService);
        defaultCustomerFacade.setCommerceCartService(commerceCartService);
        defaultCustomerFacade.setUserFacade(userFacade);
        defaultCustomerFacade.setSessionService(sessionService);
        defaultCustomerFacade.setOrderFacade(orderFacade);

        customerNameStrategy = new DefaultCustomerNameStrategy();

        defaultCustomerFacade.setCustomerNameStrategy(customerNameStrategy);

        addressModel = new MockAddressModel(9999L);
        addressModel2 = new MockAddressModel(8888L);
        addressData = new AddressData();
        addressData.setId("9999");

        customerModel = new CustomerModel();
        customerModel.setDefaultShipmentAddress(addressModel2);

        creditCardPaymentInfoModel = new CreditCardPaymentInfoModel();
        final List<CreditCardPaymentInfoModel> creditCards = new ArrayList<CreditCardPaymentInfoModel>();
        creditCards.add(creditCardPaymentInfoModel);
        ccPaymentInfoData = new CCPaymentInfoData();

        guestCustomerModel = new CustomerModel();
        guestCustomerModel.setUid(TEST_USER_UID + "|" + TEST_DUMMY);
        guestCustomerModel.setDefaultShipmentAddress(addressModel);
        guestCustomerModel.setDefaultPaymentAddress(addressModel2);

        given(addressConverter.convert(addressModel)).willReturn(addressData);
        given(creditCardPaymentInfoConverter.convert(creditCardPaymentInfoModel)).willReturn(ccPaymentInfoData);
        given(userService.getCurrentUser()).willReturn(customerModel);
        given(customerAccountService.getAddressForCode(customerModel, "9999")).willReturn(addressModel);
        given(customerAccountService.getCreditCardPaymentInfos(customerModel, true)).willReturn(creditCards);
        given(customerAccountService.getCreditCardPaymentInfoForCode(customerModel, "code"))
                .willReturn(creditCardPaymentInfoModel);
        given(mockModelService.create(CustomerModel.class)).willReturn(new CustomerModel());

        defaultCurrencyData = new CurrencyData();
        defaultCurrencyData.setIsocode("GBP");

        defaultLanguageData = new LanguageData();
        defaultLanguageData.setIsocode("en");

        given(storeSessionFacade.getDefaultCurrency()).willReturn(defaultCurrencyData);
        given(storeSessionFacade.getDefaultLanguage()).willReturn(defaultLanguageData);
    }

    @Test
    public void testGetCurrentUser() {
        final CustomerData customerData = mock(CustomerData.class);

        given(userService.getCurrentUser()).willReturn(customerModel);
        given(customerConverter.convert(customerModel)).willReturn(customerData);

        final CustomerData currentUser = defaultCustomerFacade.getCurrentCustomer();

        Assert.assertEquals(customerData, currentUser);
    }

    @Test
    public void testChangePassword() throws PasswordMismatchException {
        given(userService.getCurrentUser()).willReturn(user);
        defaultCustomerFacade.changePassword(TEST_OLD_PASS, TEST_NEW_PASS);
        verify(customerAccountService).changePassword(user, TEST_OLD_PASS, TEST_NEW_PASS);
    }

    @Test(expected = de.hybris.platform.commercefacades.user.exceptions.PasswordMismatchException.class)
    public void testChangePasswordMismatchException() throws PasswordMismatchException {
        given(userService.getCurrentUser()).willReturn(user);
        doThrow(new PasswordMismatchException("")).when(customerAccountService).changePassword(user, TEST_OLD_PASS,
                TEST_NEW_PASS);
        defaultCustomerFacade.changePassword(TEST_OLD_PASS, TEST_NEW_PASS);
    }

    @Test
    public void testForgottenPwd() {
        given(userService.getUserForUID(TEST_USER_UID.toLowerCase(), CustomerModel.class))
                .willReturn(customerModel);
        defaultCustomerFacade.forgottenPassword(TEST_USER_UID);
        verify(customerAccountService).forgottenPassword(customerModel);
    }

    @Test(expected = UnknownIdentifierException.class)
    public void testForgottenPwdInv2() {
        given(userService.getUserForUID(TEST_USER_UID.toLowerCase(), CustomerModel.class))
                .willThrow(new UnknownIdentifierException(""));
        defaultCustomerFacade.forgottenPassword(TEST_USER_UID);
    }

    @Test
    public void testRegister() throws DuplicateUidException {
        final RegisterData data = new RegisterData();
        data.setFirstName(TEST_DUMMY);
        data.setLastName(TEST_DUMMY);
        data.setLogin(TEST_DUMMY);
        data.setPassword(TEST_DUMMY);
        data.setTitleCode(TEST_DUMMY);
        final CustomerModel model = new CustomerModel();
        given(mockModelService.create(CustomerModel.class)).willReturn(model);
        defaultCustomerFacade.register(data);
        verify(customerAccountService).register(model, TEST_DUMMY);
    }

    @Test(expected = IllegalArgumentException.class)
    public void testRegisterErr() throws DuplicateUidException {
        final RegisterData data = new RegisterData();
        defaultCustomerFacade.register(data);
    }

    @Test
    public void testRegisterGuest() throws DuplicateUidException {
        final String email = "test@test.com";
        final CustomerData guestCustomerData = new CustomerData();
        guestCustomerData.setCurrency(defaultCurrencyData);
        guestCustomerData.setLanguage(defaultLanguageData);
        final CustomerModel guestCustomer = new CustomerModel();
        given(mockModelService.create(CustomerModel.class)).willReturn(guestCustomer);
        given(customerConverter.convert(guestCustomer)).willReturn(guestCustomerData);
        given(Boolean.valueOf(cartService.hasSessionCart())).willReturn(Boolean.TRUE);
        defaultCustomerFacade.createGuestUserForAnonymousCheckout(email, "Guest");

        Assert.assertEquals(StringUtils.substringAfter(guestCustomer.getUid(), "|"), email);
    }

    @Test
    public void testCreateCustomerFromGuest() throws DuplicateUidException {
        customerModel.setUid(TEST_USER_UID + "|" + TEST_DUMMY);
        defaultCustomerFacade.changeGuestToCustomer(TEST_DUMMY, "10001");
        verify(customerAccountService).convertGuestToCustomer(TEST_DUMMY, "10001");
    }

    @Test
    public void testUpdateProfile() throws DuplicateUidException {
        final String titleCode = "titleCode";
        final String firstName = "firstName";
        final String lastName = "lastName";
        final String uid = "email";
        final CustomerData customerData = new CustomerData();
        customerData.setTitleCode(titleCode);
        customerData.setFirstName(firstName);
        customerData.setLastName(lastName);
        customerData.setUid(uid);
        given(userService.getCurrentUser()).willReturn(customerModel);
        final String name = customerNameStrategy.getName(firstName, lastName);
        defaultCustomerFacade.updateProfile(customerData);
        verify(customerAccountService).updateProfile(customerModel, titleCode, name, uid);
    }

    @Test
    public void testUpdatePassword() throws TokenInvalidatedException {
        defaultCustomerFacade.updatePassword(TEST_TOKEN, TEST_NEW_PASS);
        verify(customerAccountService).updatePassword(TEST_TOKEN, TEST_NEW_PASS);
    }

    @Test
    public void testLoginSuccess() {
        final CustomerData customerData = new CustomerData();
        final CurrencyData currencyData = new CurrencyData();
        currencyData.setIsocode("PLN");
        customerData.setCurrency(currencyData);
        final Collection<CurrencyData> currencies = new ArrayList<CurrencyData>();
        currencies.add(currencyData);

        final LanguageData languageData = new LanguageData();
        languageData.setIsocode("PL");
        customerData.setLanguage(languageData);
        final Collection<LanguageData> languages = new ArrayList<LanguageData>();
        languages.add(languageData);

        given(customerConverter.convert(customerModel)).willReturn(customerData);
        given(storeSessionFacade.getAllCurrencies()).willReturn(currencies);
        given(storeSessionFacade.getAllLanguages()).willReturn(languages);
        given(Boolean.valueOf(cartService.hasSessionCart())).willReturn(Boolean.TRUE);
        defaultCustomerFacade.loginSuccess();

        verify(storeSessionFacade).setCurrentCurrency(currencyData.getIsocode());
        verify(userFacade).syncSessionLanguage();
    }

    @Test
    public void testLoginSuccessNoCurrencyAndLanguage() {
        final CustomerData customerData = new CustomerData();
        customerData.setCurrency(null);
        customerData.setLanguage(null);

        given(customerConverter.convert(customerModel)).willReturn(customerData);
        given(Boolean.valueOf(cartService.hasSessionCart())).willReturn(Boolean.TRUE);
        defaultCustomerFacade.loginSuccess();

        verify(storeSessionFacade).setCurrentCurrency(defaultCurrencyData.getIsocode());
        verify(userFacade).syncSessionLanguage();
    }

    @Test
    public void testLoginSuccessNoCart() {
        final CustomerData customerData = new CustomerData();
        customerData.setCurrency(null);
        customerData.setLanguage(null);
        given(customerConverter.convert(customerModel)).willReturn(customerData);
        given(Boolean.valueOf(cartService.hasSessionCart())).willReturn(Boolean.FALSE);
        defaultCustomerFacade.loginSuccess();
        verify(cartService, Mockito.never()).changeCurrentCartUser(customerModel);
    }

    @Test
    public void testLoginSuccessNotSetCurrent() {
        final CustomerData customerData = new CustomerData();
        final CurrencyData userCurrencyData = new CurrencyData();
        userCurrencyData.setIsocode("PLN");
        customerData.setCurrency(userCurrencyData);
        final CurrencyData currencyData = new CurrencyData();
        currencyData.setIsocode("DE");
        final Collection<CurrencyData> currencies = new ArrayList<CurrencyData>();
        currencies.add(currencyData);

        final LanguageData userLanguageData = new LanguageData();
        userLanguageData.setIsocode("PL");
        customerData.setLanguage(userLanguageData);
        final LanguageData languageData = new LanguageData();
        languageData.setIsocode("DE");
        final Collection<LanguageData> languages = new ArrayList<LanguageData>();
        languages.add(languageData);

        given(customerConverter.convert(customerModel)).willReturn(customerData);
        given(storeSessionFacade.getAllCurrencies()).willReturn(currencies);
        given(storeSessionFacade.getAllLanguages()).willReturn(languages);
        given(Boolean.valueOf(cartService.hasSessionCart())).willReturn(Boolean.TRUE);
        defaultCustomerFacade.loginSuccess();

        verify(storeSessionFacade).setCurrentCurrency(defaultCurrencyData.getIsocode());
        verify(userFacade).syncSessionLanguage();
    }

}