/***********************************************************************************************************
 * Name         : ErrorLoggerTest
 * Purpose      : Test class for ErrorLogger
 **********************************************************************************************************/
@isTest
private class ErrorLoggerTest {
    /************************************************************************************
     * APEX method tested : ErrorLogger.logError
     * Description : Verifies that errors are logged properly
     *************************************************************************************/
    @isTest
    static void logErrorTest() {
        Test.startTest();
        try {
            Opportunity opp = new Opportunity();
            insert opp;
        } catch (Exception e) {
            ErrorLogger.logError(e);
        }
        Test.stopTest();

        List<Apex_Error_Log__c> errorLogs = [SELECT Id, Error_Class_Name__c FROM Apex_Error_Log__c];
        Assert.areEqual(1, errorLogs.size());
        Assert.areEqual('ErrorLoggerTest', errorLogs[0].Error_Class_Name__c);
    }

    /************************************************************************************
     * APEX method tested : ErrorLogger.getApexError
     * Description : Verifies that errors are logged properly when using Results
     *************************************************************************************/
    @isTest
    static void getApexErrorTest() {
        Opportunity opp = new Opportunity();

        Test.startTest();
        Database.SaveResult result = Database.insert(opp, false);
        ErrorLogger.getApexError(
            new List<Database.SaveResult>{ result },
            'ErrorLoggerTest',
            'getApexErrorTest',
            'Testing update'
        );

        Database.SaveResult sResult = Database.update(opp, false);
        ErrorLogger.getApexError(
            new List<Database.SaveResult>{ sResult },
            'ErrorLoggerTest',
            'getApexErrorTest',
            'Testing insert'
        );

        Database.UpsertResult upResult = Database.upsert(opp, false);
        ErrorLogger.getApexError(
            new List<Database.UpsertResult>{ upResult },
            'ErrorLoggerTest',
            'getApexErrorTest',
            'Testing upsert'
        );

        Test.stopTest();
        Assert.areEqual(3, Database.countQuery('SELECT count() FROM Apex_Error_Log__c'));
    }
}
