org.talend.components.netsuite.client.NetSuiteClientServiceTest.java Source code

Java tutorial

Introduction

Here is the source code for org.talend.components.netsuite.client.NetSuiteClientServiceTest.java

Source

// ============================================================================
//
// Copyright (C) 2006-2017 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================

package org.talend.components.netsuite.client;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.notNull;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.internal.verification.VerificationModeFactory.times;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

import org.apache.commons.lang3.time.StopWatch;
import org.junit.Before;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.talend.components.netsuite.NetSuiteMockTestBase;
import org.talend.components.netsuite.client.model.TypeDesc;
import org.talend.components.netsuite.test.AssertMatcher;
import org.talend.components.netsuite.test.NetSuitePortTypeMockAdapterImpl;
import org.talend.components.netsuite.test.client.TestNetSuiteClientService;

import com.netsuite.webservices.test.platform.InvalidCredentialsFault;
import com.netsuite.webservices.test.platform.NetSuitePortType;
import com.netsuite.webservices.test.platform.UnexpectedErrorFault;
import com.netsuite.webservices.test.platform.core.Passport;
import com.netsuite.webservices.test.platform.core.Record;
import com.netsuite.webservices.test.platform.core.RecordRef;
import com.netsuite.webservices.test.platform.core.Status;
import com.netsuite.webservices.test.platform.InvalidSessionFault;
import com.netsuite.webservices.test.platform.faults.types.FaultCodeType;
import com.netsuite.webservices.test.platform.faults.types.StatusDetailCodeType;
import com.netsuite.webservices.test.platform.messages.AddListRequest;
import com.netsuite.webservices.test.platform.messages.AddListResponse;
import com.netsuite.webservices.test.platform.messages.AddRequest;
import com.netsuite.webservices.test.platform.messages.AddResponse;
import com.netsuite.webservices.test.platform.messages.DeleteListRequest;
import com.netsuite.webservices.test.platform.messages.DeleteListResponse;
import com.netsuite.webservices.test.platform.messages.DeleteRequest;
import com.netsuite.webservices.test.platform.messages.DeleteResponse;
import com.netsuite.webservices.test.platform.messages.GetListRequest;
import com.netsuite.webservices.test.platform.messages.GetListResponse;
import com.netsuite.webservices.test.platform.messages.GetRequest;
import com.netsuite.webservices.test.platform.messages.GetResponse;
import com.netsuite.webservices.test.platform.messages.LoginRequest;
import com.netsuite.webservices.test.platform.messages.LoginResponse;
import com.netsuite.webservices.test.platform.messages.ReadResponse;
import com.netsuite.webservices.test.platform.messages.ReadResponseList;
import com.netsuite.webservices.test.platform.messages.SessionResponse;
import com.netsuite.webservices.test.platform.messages.UpdateListRequest;
import com.netsuite.webservices.test.platform.messages.UpdateListResponse;
import com.netsuite.webservices.test.platform.messages.UpdateRequest;
import com.netsuite.webservices.test.platform.messages.UpdateResponse;
import com.netsuite.webservices.test.platform.messages.UpsertListRequest;
import com.netsuite.webservices.test.platform.messages.UpsertListResponse;
import com.netsuite.webservices.test.platform.messages.UpsertRequest;
import com.netsuite.webservices.test.platform.messages.UpsertResponse;
import com.netsuite.webservices.test.platform.messages.WriteResponse;
import com.netsuite.webservices.test.platform.messages.WriteResponseList;
import com.netsuite.webservices.test.transactions.purchases.PurchaseOrder;

/**
 * Performs testing of {@link NetSuiteClientService}'s basic functionality.
 */
public class NetSuiteClientServiceTest extends NetSuiteMockTestBase {

    private NetSuitePortType port;

    private NetSuiteClientService<NetSuitePortType> clientService;

    private NetSuiteCredentials credentials;

    @Override
    @Before
    public void setUp() throws Exception {
        installWebServiceMockTestFixture();

        super.setUp();

        port = webServiceMockTestFixture.getPortMock();

        clientService = webServiceMockTestFixture.getClientService();

        credentials = new NetSuiteCredentials();
        credentials.setEmail("test@test.com");
        credentials.setPassword("secret123");
        credentials.setAccount("12345");
        credentials.setRoleId("3");
        credentials.setApplicationId("00000000-0000-0000-0000-000000000000");
        clientService.setCredentials(credentials);

        mockLoginResponse(port);
    }

    @Test
    public void testLogin() throws Exception {
        clientService.login();

        verify(port, times(1)).login(argThat(new AssertMatcher<LoginRequest>() {

            @Override
            protected void doAssert(LoginRequest request) throws Exception {
                assertNotNull(request);

                Passport passport = request.getPassport();
                assertNotNull(passport);
            }
        }));

        // Verify that logging in not performed for already logged in client

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        RecordRef recordRef = new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        DeleteResponse response = new DeleteResponse();
        response.setWriteResponse(createSuccessWriteResponse());
        when(port.delete(notNull(DeleteRequest.class))).thenReturn(response);

        clientService.delete(recordRef);

        verify(port, times(1)).login(any(LoginRequest.class));
    }

    @Test(expected = NetSuiteException.class)
    public void testLoginInvalidCredentials() throws Exception {
        SessionResponse sessionResponse = new SessionResponse();
        sessionResponse.setStatus(NetSuitePortTypeMockAdapterImpl
                .createErrorStatus(StatusDetailCodeType.INVALID_LOGIN_CREDENTIALS, "Invalid credentials"));
        LoginResponse response = new LoginResponse();
        response.setSessionResponse(sessionResponse);

        when(port.login(any(LoginRequest.class))).thenReturn(response);

        clientService.login();
    }

    @Test(expected = NetSuiteException.class)
    public void testLoginInvalidCredentialsFault() throws Exception {
        com.netsuite.webservices.test.platform.faults.InvalidCredentialsFault faultInfo = new com.netsuite.webservices.test.platform.faults.InvalidCredentialsFault();
        faultInfo.setCode(FaultCodeType.ACCT_TEMP_UNAVAILABLE);
        faultInfo.setMessage("Account temporarily unavailable");
        InvalidCredentialsFault fault = new InvalidCredentialsFault(faultInfo.getMessage(), faultInfo);

        when(port.login(any(LoginRequest.class))).thenThrow(fault);

        clientService.login();
    }

    @Test(expected = NetSuiteException.class)
    public void testLoginUnexpectedFault() throws Exception {
        com.netsuite.webservices.test.platform.faults.UnexpectedErrorFault faultInfo = new com.netsuite.webservices.test.platform.faults.UnexpectedErrorFault();
        faultInfo.setMessage("Internal error");
        UnexpectedErrorFault fault = new UnexpectedErrorFault(faultInfo.getMessage(), faultInfo);

        when(port.login(any(LoginRequest.class))).thenThrow(fault);

        clientService.login();
    }

    @Test
    public void testGet() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");
        TypeDesc refTypeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        PurchaseOrder record = new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        RecordRef recordRef = new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), refTypeDesc)
                .composeObject();

        GetResponse response = new GetResponse();
        response.setReadResponse(createSuccessReadResponse(record));
        when(port.get(notNull(GetRequest.class))).thenReturn(response);

        clientService.get(recordRef);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).get(notNull(GetRequest.class));

        NsReadResponse readResponse = clientService.get(null);
        assertNull(readResponse.getStatus());
        assertNull(readResponse.getRecord());
    }

    @Test
    public void testGetList() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");
        TypeDesc refTypeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        List<PurchaseOrder> recordList = makeNsObjects(
                new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc), 10);

        List<RecordRef> recordRefList = makeNsObjects(
                new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), refTypeDesc), 10);

        GetListResponse response = new GetListResponse();
        response.setReadResponseList(createSuccessReadResponseList(recordList));
        when(port.getList(notNull(GetListRequest.class))).thenReturn(response);

        clientService.getList(recordRefList);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).getList(notNull(GetListRequest.class));

        List<NsReadResponse<Record>> readResponses = clientService.getList(null);
        assertTrue(readResponses.isEmpty());
    }

    @Test
    public void testAdd() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        PurchaseOrder record = new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        AddResponse response = new AddResponse();
        response.setWriteResponse(createSuccessWriteResponse());
        when(port.add(notNull(AddRequest.class))).thenReturn(response);

        clientService.add(record);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).add(notNull(AddRequest.class));

        NsWriteResponse writeResponse = clientService.add(null);
        assertNull(writeResponse.getStatus());
        assertNull(writeResponse.getRef());
    }

    @Test
    public void testAddList() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        List<PurchaseOrder> recordList = makeNsObjects(
                new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc), 10);

        AddListResponse response = new AddListResponse();
        response.setWriteResponseList(createSuccessWriteResponseList(recordList.size()));
        when(port.addList(notNull(AddListRequest.class))).thenReturn(response);

        clientService.addList(recordList);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).addList(notNull(AddListRequest.class));

        List<NsWriteResponse<RecordRef>> writeResponses = clientService.addList(null);
        assertTrue(writeResponses.isEmpty());
    }

    @Test
    public void testUpdate() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        PurchaseOrder record = new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        UpdateResponse response = new UpdateResponse();
        response.setWriteResponse(createSuccessWriteResponse());
        when(port.update(notNull(UpdateRequest.class))).thenReturn(response);

        clientService.update(record);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).update(notNull(UpdateRequest.class));

        NsWriteResponse writeResponse = clientService.update(null);
        assertNull(writeResponse.getStatus());
        assertNull(writeResponse.getRef());
    }

    @Test
    public void testUpdateList() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        List<PurchaseOrder> recordList = makeNsObjects(
                new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc), 10);

        UpdateListResponse response = new UpdateListResponse();
        response.setWriteResponseList(createSuccessWriteResponseList(recordList.size()));
        when(port.updateList(notNull(UpdateListRequest.class))).thenReturn(response);

        clientService.updateList(recordList);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).updateList(notNull(UpdateListRequest.class));

        List<NsWriteResponse<RecordRef>> writeResponses = clientService.updateList(null);
        assertTrue(writeResponses.isEmpty());
    }

    @Test
    public void testUpsert() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        PurchaseOrder record = new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        UpsertResponse response = new UpsertResponse();
        response.setWriteResponse(createSuccessWriteResponse());
        when(port.upsert(notNull(UpsertRequest.class))).thenReturn(response);

        clientService.upsert(record);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).upsert(notNull(UpsertRequest.class));

        NsWriteResponse writeResponse = clientService.upsert(null);
        assertNull(writeResponse.getStatus());
        assertNull(writeResponse.getRef());
    }

    @Test
    public void testUpsertList() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("PurchaseOrder");

        List<PurchaseOrder> recordList = makeNsObjects(
                new NsObjectComposer<PurchaseOrder>(clientService.getMetaDataSource(), typeDesc), 10);

        UpsertListResponse response = new UpsertListResponse();
        response.setWriteResponseList(createSuccessWriteResponseList(recordList.size()));
        when(port.upsertList(notNull(UpsertListRequest.class))).thenReturn(response);

        clientService.upsertList(recordList);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).upsertList(notNull(UpsertListRequest.class));

        List<NsWriteResponse<RecordRef>> writeResponses = clientService.upsertList(null);
        assertTrue(writeResponses.isEmpty());
    }

    @Test
    public void testDelete() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        RecordRef recordRef = new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        DeleteResponse response = new DeleteResponse();
        response.setWriteResponse(createSuccessWriteResponse());
        when(port.delete(notNull(DeleteRequest.class))).thenReturn(response);

        clientService.delete(recordRef);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).delete(notNull(DeleteRequest.class));

        NsWriteResponse writeResponse = clientService.delete(null);
        assertNull(writeResponse.getStatus());
        assertNull(writeResponse.getRef());
    }

    @Test
    public void testDeleteList() throws Exception {

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        List<RecordRef> recordRefList = makeNsObjects(
                new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), typeDesc), 10);

        DeleteListResponse response = new DeleteListResponse();
        response.setWriteResponseList(createSuccessWriteResponseList(recordRefList.size()));
        when(port.deleteList(notNull(DeleteListRequest.class))).thenReturn(response);

        clientService.deleteList(recordRefList);

        verify(port, times(1)).login(notNull(LoginRequest.class));
        verify(port, times(1)).deleteList(notNull(DeleteListRequest.class));

        List<NsWriteResponse<RecordRef>> writeResponses = clientService.deleteList(null);
        assertTrue(writeResponses.isEmpty());
    }

    @Test
    public void testRetrying() throws Exception {

        clientService.setRetryCount(3);
        clientService.setRetryInterval(1);

        clientService.login();

        TypeDesc typeDesc = clientService.getMetaDataSource().getTypeInfo("RecordRef");

        RecordRef recordRef = new NsObjectComposer<RecordRef>(clientService.getMetaDataSource(), typeDesc)
                .composeObject();

        final DeleteResponse response = new DeleteResponse();
        response.setWriteResponse(createSuccessWriteResponse());

        final AtomicInteger counter = new AtomicInteger(3);

        when(port.delete(notNull(DeleteRequest.class))).thenAnswer(new Answer<DeleteResponse>() {

            @Override
            public DeleteResponse answer(InvocationOnMock invocation) throws Throwable {
                if (counter.decrementAndGet() > 0) {
                    com.netsuite.webservices.test.platform.faults.InvalidSessionFault faultInfo = new com.netsuite.webservices.test.platform.faults.InvalidSessionFault();
                    faultInfo.setCode(FaultCodeType.SESSION_TIMED_OUT);
                    faultInfo.setMessage("Session timed out");
                    InvalidSessionFault fault = new InvalidSessionFault(faultInfo.getMessage(), faultInfo);
                    throw fault;
                }

                return response;
            }
        });

        StopWatch stopWatch = new StopWatch();
        stopWatch.start();

        clientService.delete(recordRef);

        stopWatch.stop();

        verify(port, times(3)).login(notNull(LoginRequest.class));
        verify(port, times(3)).delete(notNull(DeleteRequest.class));

        assertTrue(stopWatch.getTime() >= 3 * clientService.getRetryInterval() * 1000);
    }

    @Test(expected = NetSuiteException.class)
    public void testCheckError() throws Exception {
        Status status = NetSuitePortTypeMockAdapterImpl.createErrorStatus(StatusDetailCodeType.FILE_REQD,
                "Field(s) required: recType");
        NsStatus nsStatus = TestNetSuiteClientService.toNsStatus(status);

        NetSuiteClientService.checkError(nsStatus);
    }

    @Test
    public void testCheckErrorStatusOk() throws Exception {
        NsStatus nsStatus = new NsStatus();
        nsStatus.setSuccess(true);

        NetSuiteClientService.checkError(nsStatus);
    }

    private ReadResponseList createSuccessReadResponseList(List<? extends Record> recordList) {
        ReadResponseList readResponseList = new ReadResponseList();
        readResponseList.setStatus(NetSuitePortTypeMockAdapterImpl.createSuccessStatus());
        for (int i = 0; i < recordList.size(); i++) {
            Record record = recordList.get(i);
            ReadResponse readResponse = createSuccessReadResponse(record);
            readResponseList.getReadResponse().add(readResponse);
        }
        return readResponseList;
    }

    private ReadResponse createSuccessReadResponse(Record record) {
        ReadResponse readResponse = new ReadResponse();
        readResponse.setStatus(NetSuitePortTypeMockAdapterImpl.createSuccessStatus());
        readResponse.setRecord(record);
        return readResponse;
    }

    private WriteResponseList createSuccessWriteResponseList(int recordCount) {
        WriteResponseList writeResponseList = new WriteResponseList();
        writeResponseList.setStatus(NetSuitePortTypeMockAdapterImpl.createSuccessStatus());
        for (int i = 0; i < recordCount; i++) {
            WriteResponse writeResponse = createSuccessWriteResponse();
            writeResponseList.getWriteResponse().add(writeResponse);
        }
        return writeResponseList;
    }

    private WriteResponse createSuccessWriteResponse() {
        WriteResponse writeResponse = new WriteResponse();
        writeResponse.setStatus(NetSuitePortTypeMockAdapterImpl.createSuccessStatus());
        RecordRef recordRef = new RecordRef();
        recordRef.setInternalId(Integer.valueOf(10000 + rnd.nextInt()).toString());
        writeResponse.setBaseRef(recordRef);
        return writeResponse;
    }
}