@isTest
private class ReceivingNoteDetailSelectControllerTest {
    static ReceivingNoteTestDataFactory factory;
    /**
    @description 安装master数据
    */
    @testSetup static void setupMasterData(){
        factory = new ReceivingNoteTestDataFactory();
        factory.setupMasterData();
    }
    /**
    @param typeStringListString 格式：'备品类型,管理种类;备品类型,管理种类...'
    @description 造出指定类型的清单数据,并插入数据库
    */
    static void setupTestData(String typeStringListString){
        factory = new ReceivingNoteTestDataFactory();
        if(String.isBlank(typeStringListString)){
            typeStringListString = '固定资产,个体管理;附属品,个体管理;附属品,数量管理;耗材,数量管理;低值易耗品,数量管理';
        }
        List<String> typeStringList = typeStringListString.split(';');
        factory.setupReceivingNoteData(typeStringList);
    }

    /**
    @description 从数据确认画面跳转来的save方法
    */
    static testMethod void unitTestSaveFromWaitingReceipt(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;

        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId);
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();
        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有一条一览明细
        // System.assertEquals(1,rndList.size());

        Test.startTest();

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        // System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为3
        rnd.Rental_Num__c = 3;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = 3;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 原有的1条加上后加的3条，一共有4条一览明细
        // System.assertEquals(4,rndList.size());
        Test.stopTest();
    }
    /**
    @description 从验收画面跳转来的save方法:新建明细
    */
    static testMethod void unitTestSaveFromAcceptanceNew(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;

        PageReference startPage = new PageReference('/apex/ReceivingNoteAcceptance?id=' + rnId);
        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId+'&returl=' + startPage.getUrl());
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();
        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有一条一览明细
        // System.assertEquals(1,rndList.size());

        Test.startTest();

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        // System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为1
        rnd.Rental_Num__c = 1;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = 3;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                     , Change_Point__c
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 原有的1条新建1条，一共有2条一览明细
        // System.assertEquals(2,rndList.size());
        // System.assertEquals('新建', rndList[1].Change_Point__c);

        Test.stopTest();
    }

    /**
    @description 从验收画面跳转来调整附属品:增加明细
    */
    static testMethod void unitTestSaveFromAcceptanceAdd(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;
        addDetails(rnsId, 1);

        PageReference startPage = new PageReference('/apex/ReceivingNoteAcceptance?id=' + rnId);
        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId+'&returl=' + startPage.getUrl());
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();
        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有2条一览明细
        // System.assertEquals(2,rndList.size());

        Test.startTest();

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        // System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为2
        rnd.Rental_Num__c = 2;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = 2;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                     , Change_Point__c
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 原有的2条再加上1条，一共有3条一览明细
        // System.assertEquals(3,rndList.size());
        // System.assertEquals('增加', rndList[2].Change_Point__c);

        Test.stopTest();

    }
    /**
    @description 从验收画面跳转来的save方法:减少明细
    */
    static testMethod void unitTestSaveFromAcceptanceDelete(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;
        addDetails(rnsId, 1);

        PageReference startPage = new PageReference('/apex/ReceivingNoteAcceptance?id=' + rnId);
        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId+'&returl=' + startPage.getUrl());
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();
        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有2条一览明细
        // System.assertEquals(2,rndList.size());

        Test.startTest();

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为0
        rnd.Rental_Num__c = 0;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = 0;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                     , Change_Point__c
                     , Delete_Flag__c
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 2条减去1条，则第2条明细变更为'删除'
        // System.assertEquals(2, rndList.size());
        // System.assertEquals('删除', rndList[1].Change_Point__c);

        Test.stopTest();

    }
    static void addDetails(Id rnsId, Integer n){

        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId);
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();
        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有一条一览明细
        System.assertEquals(1,rndList.size());

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为n
        rnd.Rental_Num__c = n;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = n;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 原有的1条加上后加的n条，一共有n+1条一览明细
        // System.assertEquals(n+1,rndList.size());
    }

    /**
    @description 测试【返回】按钮
    */
    static testMethod void unitTestGoBack(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;
        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?raesid='+rnsId+'&sids='+rnsId);
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();

        Test.startTest();
        PageReference pg = controller.goBack();
        System.assertEquals(rnId, pg.getParameters().get('pt_recid'));
        System.assertEquals(rnsId, pg.getParameters().get('raesid'));
        Test.stopTest();

    }

    /**
    @description 测试发邮件按钮
    */
    static testMethod void unitTestSendEmail(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;

        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?raesid='+rnsId+'&sids='+rnsId);
        Test.setCurrentPage(ref);

        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        ReceivingNoteSummary__c rns = [select Name, No_Matching_Reminder_Email_Text__c from ReceivingNoteSummary__c WHERE Id=:rnsId ];
        System.assertEquals(null, rns.No_Matching_Reminder_Email_Text__c);

        Test.startTest();
        // 初始化
        controller.init();

        String emailMsg = rns.Name;
        String emailBody = 'ARE YOU OK?';
        ref.getParameters().put('emailBody', emailBody);
        controller.sendEmail();

        ReceivingNoteSummary__c newRns = [select No_Matching_Reminder_Email_Text__c from ReceivingNoteSummary__c WHERE Id=:rnsId ];
        System.assertEquals('【自由填写内容】\nARE YOU OK?\n备品配套：\nSB-FS-01', newRns.No_Matching_Reminder_Email_Text__c);

        Test.stopTest();
    }
    // 配套中的产品与接口来的不一致时，发生变体
    static testMethod void unitTestBianti(){
        setupTestData('固定资产,个体管理');
        Id rnId = factory.rnMap.get('固定资产,个体管理').Id;
        Id rnsId = factory.rnsMap.get('固定资产,个体管理').Id;
        factory.fsdList[0].Product2__c = factory.proList[2].Id;
        update factory.fsdList[0];
        factory.proList[0].Default_Fixture_Arrival_Product__c = factory.proList[2].Id;
        factory.proList[0].Default_Fixture_Arrival_Process__c = '变体';
        update factory.proList[0];

        PageReference ref = new PageReference('/apex/ReceivingNoteDetailSelect?sids=' + rnsId);
        Test.setCurrentPage(ref);
        ReceivingNoteDetailSelectController controller = new ReceivingNoteDetailSelectController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();

        List<ReceivingNoteDetail__c> rndList = [
                SELECT Id
                     , Default_Fixture_Arrival_Process__c
                     , Default_Fixture_Arrival_Product__c
                     , Fixture_Arrival_Process__c
                     , Fixture_Arrival_Product__c
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 本来有一条一览明细
        System.assertEquals(1,rndList.size());
        System.assertEquals('变体', rndList[0].Default_Fixture_Arrival_Process__c);
        System.assertEquals(factory.proList[2].Id, rndList[0].Default_Fixture_Arrival_Product__c);
        System.assertEquals(null, rndList[0].Fixture_Arrival_Process__c);
        System.assertEquals(null, rndList[0].Fixture_Arrival_Product__c);

        Test.startTest();

        controller.init();
        controller.searchOpp();
        // 配套明细有两个
        System.assertEquals(2, controller.viewList.size());
        ReceivingNoteDetail__c rnd = (ReceivingNoteDetail__c) controller.viewList[1].sobj;

        // 第二种配套明细数量调为3
        rnd.Rental_Num__c = 3;
        //add by rentx 20210824 start 
        rnd.Fixture_Set_New_Quantity__c = 3;
        //add by rentx 20210824 end
        controller.viewList[0].check = true;
        controller.viewList[1].check = true;
        controller.save();

        rndList = [
                SELECT Id
                     , Fixture_Arrival_Process__c
                     , Fixture_Arrival_Product__c
                  FROM ReceivingNoteDetail__c
                 WHERE ReceivingNoteSummary__c =: rnsId
            ];
        // 原有的1条加上后加的3条，一共有4条一览明细
        // System.assertEquals(4,rndList.size());

        // System.assertEquals('变体', rndList[0].Fixture_Arrival_Process__c);
        // System.assertEquals(factory.proList[2].Id, rndList[0].Fixture_Arrival_Product__c);

        Test.stopTest();

    }
}