/**********************************************************************************************************
 * Name         : UniqueCustomerBatchProcessTest
 * Purpose      : Test class for UniqueCustomerBatchProcess
 **********************************************************************************************************/

@isTest
public class UniqueCustomerBatchProcessTest {
    private static String customerEmail = 'customer01@sonymusic.com';
    private static String customerEmail2 = 'customer02@sonymusic.com';

    @TestSetup
    static void makeData() {
        Territory__c territory = TestFactory.createTerritory(TestFactory.DEFAULT_TERRITORY_NAME);
        Label__c label = TestFactory.createLabel('My Label');
        TL__c tl = TestFactory.createTerritoryLabel(true);
        TLA__c tla = TestFactory.createTerritoryLabelArtist('My TLA', true, tl.Id, territory.Id, label.Id, null);
        Mailing_List__c mailingList = TestFactory.createMailingList('My ML', tla.Id);
        Form__c form = TestFactory.createForm(tla.Id, 'NewsLetter');

        insert new List<Ecommerce_Store__c>{
            new Ecommerce_Store__c(Name = 'S00046', Form_ID__c = form.Id),
            new Ecommerce_Store__c(Name = 'S00047', Form_ID__c = form.Id)
        };

        List<Ecommerce_Customer__c> firstSetOfCustomers = new List<Ecommerce_Customer__c>();
        for (Integer i = 0; i < 3; i++) {
            firstSetOfCustomers.add(
                new Ecommerce_Customer__c(
                    Email__c = customerEmail,
                    Address_1__c = 'Address 1',
                    Address_2__c = 'Address 1',
                    First_Name__c = 'Cust',
                    Last_Name__c = 'Omer',
                    City__c = 'Berlin',
                    Country__c = 'Germany',
                    Store_ID__c = 'S00046'
                )
            );
        }
        insert firstSetOfCustomers;

        List<Ecommerce_Customer__c> secondSetOfCustomers = new List<Ecommerce_Customer__c>();
        for (Integer i = 0; i < 3; i++) {
            secondSetOfCustomers.add(
                new Ecommerce_Customer__c(
                    Email__c = customerEmail2,
                    Address_1__c = 'Address 1',
                    Address_2__c = 'Address 1',
                    First_Name__c = 'Cust',
                    Last_Name__c = 'Omer',
                    City__c = 'Berlin',
                    Country__c = 'Germany',
                    Store_ID__c = 'S00047'
                )
            );
        }
        insert secondSetOfCustomers;
    }

    /************************************************************************************
      * Method: testUniqueCustomerInsert
      * APEX method tested : UniqueCustomerBatchProcess.execute
      * Description : Verifies that a new Unique Customer record is created then there is no
      * Email match with the Ecommerce Customers being processed
      *************************************************************************************/
    @isTest
    static void testUniqueCustomerInsert() {
        List<Unique_Customer__c> uniqueCustomers = [SELECT Id FROM Unique_Customer__c];
        Assert.isTrue(uniqueCustomers.isEmpty());

        Test.startTest();
        Database.executeBatch(new UniqueCustomerBatchProcess());
        Test.stopTest();

        uniqueCustomers = [
            SELECT Id, Email__c, Source_Form_ID__c
            FROM Unique_Customer__c
            WHERE Email__c IN (:customerEmail, :customerEmail2)
        ];
        Assert.areEqual(2, uniqueCustomers.size());

        Form__c form = [SELECT Id FROM Form__c LIMIT 1];
        Assert.areEqual(form.Id, uniqueCustomers[0].Source_Form_ID__c);
    }

    /************************************************************************************
      * Method: testUniqueCustomerUpdate
      * APEX method tested : UniqueCustomerBatchProcess.execute
      * Description : Verifies that the Unique Customer fields are updated 
      * based on the Ecommerce Customers being processed
      *************************************************************************************/
    @isTest
    static void testUniqueCustomerUpdate() {
        Ecommerce_Customer__c customer = [
            SELECT Id, City__c
            FROM Ecommerce_Customer__c
            WHERE Email__c = :customerEmail
            LIMIT 1
        ];

        Unique_Customer__c uniqueCustomer = new Unique_Customer__c(Email__c = customerEmail, City__c = 'Paris');
        insert uniqueCustomer;

        Test.startTest();
        Database.executeBatch(new UniqueCustomerBatchProcess());
        Test.stopTest();

        uniqueCustomer = [SELECT Id, City__c FROM Unique_Customer__c WHERE Id = :uniqueCustomer.Id];
        Assert.areEqual(uniqueCustomer.City__c, customer.City__c);
    }
}