@isTest
private class ReceivingNoteListFirstControllerTest {
    static ReceivingNoteTestDataFactory factory;
    static User user;
    /**
    @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);
        User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()];
        System.runAs (thisUser) {
            Profile p = [SELECT Id FROM Profile WHERE Name LIKE '%2B3%' Limit 1];
            UserRole r = [SELECT Id FROM UserRole WHERE DeveloperName = 'Stock_Article_Management_Member' Limit 1];
            user = new User(alias = 'test', email='test@acme.com', 
                emailencodingkey='UTF-8', lastname='test', 
                languagelocalekey='en_US', 
                localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
                timezonesidkey='Asia/Shanghai', 
                username='test@acme.com' + Datetime.now().getTime());
            insert user;
        }

    }

    /**
    @description 测试检索功能：按不同条件检索，并检查检索结果
    */
    static testMethod void unitTestSearch() {
        setupTestData('');

        System.runAs(user){

        PageReference ref = new PageReference('/apex/ReceivingNoteListFirst');
        Test.setCurrentPage(ref);

        ReceivingNoteListFirstController controller = new ReceivingNoteListFirstController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();

        Test.startTest();
        controller.init();
        controller.getbieCunFangDiOps();
        controller.getbieBenBuOps();
        controller.getbieChanPinFenLeiOps();
        controller.getbieBeiPinFenLeiOps();
        controller.getAsset_loaner_categoryOps();
        controller.getRNStatusOpss();
        controller.searchOpp();

        // 不加检索条件显示所有清单
        System.assertEquals(5, controller.viewList.size());
        // 存放地
        controller.bieCunFangDi = '北京 备品中心';
        controller.orderCode = null;
        controller.approvalNumber = null;
        controller.asset_loaner_category = null;
        controller.dateOfDelivery = null;
        controller.status = null;
        controller.searchOpp();
        System.assertEquals(5, controller.viewList.size());
        for(CreateRelationListPagingCtrlBase.WrapperInfo v : controller.viewList){
            ReceivingNote__c rn = (ReceivingNote__c) v.sobj ;
            System.assertEquals('北京 备品中心', rn.Internal_asset_location__c );
        }

        // 订单编码
        controller.bieCunFangDi = null;
        controller.orderCode='SB-ORDERCODE-1';
        controller.approvalNumber = null;
        controller.asset_loaner_category = null;
        controller.dateOfDelivery = null;
        controller.status = null;

        controller.searchOpp();
        System.assertEquals(1, controller.viewList.size());
        ReceivingNote__c rn1 = (ReceivingNote__c) controller.viewList[0].sobj ;
        System.assertEquals('SB-ORDERCODE-1', rn1.OrderCode__c);

        //裁决号
        controller.bieCunFangDi = null;
        controller.orderCode = null;
        controller.approvalNumber = 'SB-APPROVALNUMBER-2';
        controller.asset_loaner_category = null;
        controller.dateOfDelivery = null;
        controller.status = null;

        controller.searchOpp();
        System.assertEquals(1, controller.viewList.size());
        ReceivingNote__c rn2 = (ReceivingNote__c) controller.viewList[0].sobj ;
        System.assertEquals('SB-APPROVALNUMBER-2', rn2.ApprovalNumber__c);

        // 备品类别
        controller.bieCunFangDi = null;
        controller.orderCode = null;
        controller.approvalNumber = null;
        controller.asset_loaner_category = '附属品';
        controller.dateOfDelivery = null;
        controller.status = null;

        controller.searchOpp();
        System.assertEquals(2, controller.viewList.size());
        for(CreateRelationListPagingCtrlBase.WrapperInfo v : controller.viewList){
            ReceivingNote__c rn = (ReceivingNote__c) v.sobj ;
            System.assertEquals('附属品', rn.Asset_loaner_category__c );
        }

        // 发货日
        controller.bieCunFangDi = null;
        controller.orderCode = null;
        controller.approvalNumber = null;
        controller.asset_loaner_category = null;
        String todayStr =  System.Now().format('yyyy-MM-dd');
        controller.dateOfDelivery = todayStr;

        controller.status = null;

        controller.searchOpp();

        System.assertEquals(5, controller.viewList.size());
        for(CreateRelationListPagingCtrlBase.WrapperInfo v : controller.viewList){
            ReceivingNote__c rn = (ReceivingNote__c) v.sobj ;
            System.assertEquals(Date.Today(), rn.DateOfDelivery__c);
        }

        // 收货状态
        controller.bieCunFangDi = null;
        controller.orderCode = null;
        controller.approvalNumber = null;
        controller.asset_loaner_category = null;
        controller.dateOfDelivery = null;
        controller.status = '待数据确认';

        controller.searchOpp();
        System.assertEquals(5, controller.viewList.size());
        for(CreateRelationListPagingCtrlBase.WrapperInfo v : controller.viewList){
            ReceivingNote__c rn = (ReceivingNote__c) v.sobj ;
            System.assertEquals('待数据确认', rn.RN_Status__c);
        }

        Test.stopTest();
        }
    }
    /**
    @description 测试入库指示
    */
    static testMethod void unitTestInStockRequest() {
        // 造出可以做入库指示的明细
        setupTestData('固定资产,个体管理');

        ReceivingNoteDetail__c rnd = factory.rndMap.get('固定资产,个体管理');
        ReceivingNoteSummary__c rns = factory.rnsMap.get('固定资产,个体管理');
        // 数据确认
        rnd.unknow_serial_NO_product__c = 'TRUE';
        rnd.Loaner_accsessary__c = 'TRUE';
        rnd.DataConfirmation__c = true;
        // 收货
        rns.Received_Confirm_Time__c = Datetime.now();
        rns.Package_Status__c = 'OK';
        upsert rns Id;
        // 清点
        rnd.AcceptanceResult__c = 'OK';
        rnd.AcceptanceTime__c = Datetime.now();
        // 验收
        rnd.Inspection_result_after__c = 'OK';
        rnd.After_Inspection_time__c = Datetime.now();
        // 再确认
        rnd.DataConfirmationAgain__c = true;
        upsert rnd Id;

        System.runAs(user){
        PageReference ref = new PageReference('/apex/ReceivingNoteListFirst');
        Test.setCurrentPage(ref);
        ReceivingNoteListFirstController controller = new ReceivingNoteListFirstController();
        CreateRelationListPagingCmpCtrl cmp = new CreateRelationListPagingCmpCtrl();
        cmp.pageController = controller;
        controller.myComponentController.init();

        Test.startTest();

        controller.init();
        controller.status = '待入库指示';
        controller.searchOpp();
        // 不加检索条件显示所有清单
        System.assertEquals(1, controller.viewList.size());

        // 入库指示
        controller.viewList[0].check = true;
        controller.inStockRequest();
        ReceivingNoteDetail__c newRnd = [
                SELECT Arrival_wh_Request_time__c
                  FROM ReceivingNoteDetail__c
                 WHERE Id =: rnd.Id
            ];
        System.assertNotEquals(null, newRnd.Arrival_wh_Request_time__c);

        Test.stopTest();
        }
    }
}