@isTest
private class CampaignTriggerBefInsTest {

	// キャンペーン：内部トレーニングのレコードタイプを取得
    private static final RecordType campaignRC = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Internal_training' AND SObjectType = 'Campaign'];

	// キャンペーン：外部向けのレコードタイプを取得
    private static final RecordType campaignRCSociety = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Society' AND SObjectType = 'Campaign'];
    private static final RecordType campaignRCTraining = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Training_event' AND SObjectType = 'Campaign'];
    private static final RecordType campaignRCService = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Service_trainig' AND SObjectType = 'Campaign'];
    private static final RecordType ServiceEngineerTraining = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'ServiceEngineerTraining' AND SObjectType = 'Campaign'];

    // キャンペーンメンバー：内部向けのレコードタイプを取得
    private static final RecordType campaignMemberRC = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Internal_training_participants' AND SObjectType = 'CampaignMember'];

    // キャンペーンメンバー：外部向けのレコードタイプを取得
    private static final RecordType campaignMemberOuterRC = [SELECT Id, DeveloperName FROM RecordType WHERE DeveloperName = 'Workshop' AND SObjectType = 'CampaignMember'];

    /**
     * キャンペーンを insertしたときに、キャンペーンメンバーのレコードタイプが強制的に
     * 決定されていることを確認する。
     * 内部キャンペーンの場合
     */
    static testMethod void testInsertInternal() {
        StaticParameter.EscapeCampain =false;
        StaticParameter.shareToOSCMFlag = false;
    	Campaign target = new Campaign();
    	target.Name = 'test campaign';
    	target.RecordTypeId = campaignRC.Id;	// 内部トレーニング
        target.JingliApprovalManager__c = UserInfo.getUserId();
    	insert target;

        StaticParameter.EscapeCampain =false;
        
        Campaign target1 = new Campaign();
        target1.Id = target.Id;
        target1.Name= 'test1 campaign'; 
        update target1;

    	
    	// CanpaignMemberのレコードタイプを検査
    	target = [SELECT Id, CampaignMemberRecordTypeId FROM Campaign WHERE Id = :target.Id];
    	System.assertEquals( campaignMemberRC.Id, target.CampaignMemberRecordTypeId);
    }

	/**
     * キャンペーンを insertしたときに、キャンペーンメンバーのレコードタイプが強制的に
     * 決定されていることを確認する。
     * 外部向けの場合 1
     */
    static testMethod void testInsertSociety() {
        StaticParameter.EscapeCampain =false;
        StaticParameter.shareToOSCMFlag = false;
    	Campaign target = new Campaign();
    	target.Name = 'test campaign';
    	target.RecordTypeId = campaignRCSociety.Id;	// 内部トレーニング
        target.JingliApprovalManager__c = UserInfo.getUserId();
        target.HostName__c ='Test01';
        target.cooperatorCompany__c ='Test02';
    	insert target;
    	
        Campaign target1 = new Campaign();
        target1.Id = target.Id;
        target1.Name= 'test1 campaign'; 
        update target1;
     	// CanpaignMemberのレコードタイプを検査
    	target = [SELECT Id, CampaignMemberRecordTypeId FROM Campaign WHERE Id = :target.Id];
    	System.assertEquals( campaignMemberOuterRC.Id, target.CampaignMemberRecordTypeId);
    }

	/**
     * キャンペーンを insertしたときに、キャンペーンメンバーのレコードタイプが強制的に
     * 決定されていることを確認する。
     * 外部向けの場合 2
     */
    static testMethod void testInsertTraining() {
        StaticParameter.EscapeCampain =false;
        StaticParameter.shareToOSCMFlag = false;
    	Campaign target = new Campaign();
    	target.Name = 'test campaign';
    	target.RecordTypeId = campaignRCTraining.Id;	// 外部トレーニング
        target.JingliApprovalManager__c = UserInfo.getUserId();
    	insert target;
    	
        Campaign target1 = new Campaign();
        target1.Id = target.Id;
        target1.Name= 'test1 campaign'; 
        update target1;
     	// CanpaignMemberのレコードタイプを検査
    	target = [SELECT Id, CampaignMemberRecordTypeId FROM Campaign WHERE Id = :target.Id];
    	System.assertEquals( campaignMemberOuterRC.Id, target.CampaignMemberRecordTypeId);
    }
    
	/**
     * キャンペーンを insertしたときに、キャンペーンメンバーのレコードタイプが強制的に
     * 決定されていることを確認する。
     * 外部向けの場合 3
     */
    static testMethod void testInsertService() {
        StaticParameter.EscapeCampain =false;
        StaticParameter.shareToOSCMFlag = false;
    	Campaign target = new Campaign();
    	target.Name = 'test campaign';
    	target.RecordTypeId = ServiceEngineerTraining.Id;	// 外部トレーニング
        target.JingliApprovalManager__c = UserInfo.getUserId();
    	insert target;
        Campaign target1 = new Campaign();
        target1.Id = target.Id;
        target1.Name= 'test1 campaign'; 
        update target1;
    	
     	// CanpaignMemberのレコードタイプを検査
    	target = [SELECT Id, CampaignMemberRecordTypeId FROM Campaign WHERE Id = :target.Id];
    	System.assertEquals( campaignMemberOuterRC.Id, target.CampaignMemberRecordTypeId);
    }
    
}