/*-
 * ~~~~~~licensing~~~~~~
 * cef-logger-layout
 * ==========
 * Copyright (C) 2020 - 2025 EmDev LLC
 * ==========
 * You may not use this file except in accordance with the License Terms of the Copyright
 * Holder located at: https://entaxy.ru/eula . All copyrights, all intellectual property
 * rights to the Software and any copies are the property of the Copyright Holder. Unless
 * it is explicitly allowed the Copyright Holder, the User is prohibited from using the
 * Software for commercial purposes to provide services to third parties.
 * 
 * The Copyright Holder hereby declares that the Software is provided on an "AS IS".
 * Under no circumstances does the Copyright Holder guarantee or promise that the
 * Software provided by him will be suitable or not suitable for the specific purposes
 * of the User, that the Software will meet all commercial and personal subjective
 * expectations of the User, that the Software will work properly, without technical
 * errors, quickly and uninterruptedly.
 * 
 * Under no circumstances shall the Copyright Holder or its Affiliates is not liable
 * to the User for any direct or indirect losses of the User, his expenses or actual
 * damage, including, downtime; loss of bussines; lost profit; lost earnings; loss
 * or damage to data, property, etc.
 * ~~~~~~/licensing~~~~~~
 */
package ru.emdev.cef;


import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;

public class ProcessingTest {

    public static final String AUDIT_LOG_MARKER = "auditLog";
    private CEFLayout cefLayout;
    private AuditLayout auditLayout;

    @BeforeEach
    protected void setUp() {
        cefLayout = new CEFLayout("", "|", "", "", "", "cef");
        auditLayout = Mockito.mock(AuditLayout.class);
        Mockito.when(auditLayout.toSerializable(any())).thenReturn(AUDIT_LOG_MARKER);
        cefLayout.setAuditLayout(auditLayout);
    }

    @Test
    public void testIsEmdevEvents() {
        LogEvent emdevOne = createLogEvent("{\"isEmdevEvents\": \"true\"}");
        String message = cefLayout.toSerializable(emdevOne);
        assertNotNull(message);
        verify(auditLayout, never()).toSerializable(any());
    }

    @Test
    public void testNotEmdevEvents() {
        LogEvent emdevOne = createLogEvent("{\"isEmdevEvents\": \"false\"}");
        String message = cefLayout.toSerializable(emdevOne);
        assertNotNull(message);
        verify(auditLayout, times(1)).toSerializable(any());
    }

    @Test
    public void testSkipJsonWithoutEmdevMarker() {
        LogEvent emdevOne = createLogEvent("{}");
        String message = cefLayout.toSerializable(emdevOne);
        assertNotNull(message);
        verify(auditLayout, times(1)).toSerializable(any());
    }

    @Test
    public void testSkipPlainText() {
        LogEvent emdevOne = createLogEvent("Log message");
        String message = cefLayout.toSerializable(emdevOne);
        assertNotNull(message);
        verify(auditLayout, times(1)).toSerializable(any());
    }

    private static LogEvent createLogEvent(String message) {
        LogEvent event = Mockito.mock(LogEvent.class);
        Message logMessage = Mockito.mock(Message.class);
        Mockito.when(logMessage.getFormattedMessage()).thenReturn(message);
        Mockito.when(event.getMessage()).thenReturn(logMessage);
        return event;
    }

}
