package com.sonymusic

import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

import static org.junit.jupiter.api.Assertions.assertTrue

class WithDatadogTestOptimizationEnvTest extends BaseGlobalVarTest {
    def withDatadogTestOptimizationEnv

    @BeforeEach
    void setUp() {
        super.setUp()
        withDatadogTestOptimizationEnv = loadScript("vars/withDatadogTestOptimizationEnv.groovy")

        binding.setVariable('env', [
            GIT_URL: 'https://github.com/theorchard/lambda-product-transfer',
            GIT_COMMIT: 'abc123def456',
            GIT_BRANCH: 'master',
            JENKINS_URL: 'https://jenkins.example.com/',
            BUILD_URL: 'https://jenkins.example.com/job/lambda-product-transfer/1/',
            BUILD_NUMBER: '1',
            BUILD_TAG: 'jenkins-lambda-product-transfer-1',
            JOB_NAME: 'lambda-product-transfer',
        ])

        helper.registerAllowedMethod('sh', [Map.class], { Map args ->
            if (args.script.contains('%an')) return 'Test Author'
            if (args.script.contains('%ae')) return 'test@example.com'
            if (args.script.contains('%s')) return 'Test commit message'
            return ''
        })
    }

    private List<String> capturedEnvVars() {
        def call = getMethodCalls('withEnv')[0]
        return (call.args[0] as List).collect { it.toString() }
    }

    @Test
    void testClosureIsCalled() {
        def closureCalled = false
        withDatadogTestOptimizationEnv {
            closureCalled = true
        }
        assertTrue(closureCalled)
    }

    @Test
    void testGitEnvVarsAreSet() {
        withDatadogTestOptimizationEnv {}

        def envVars = capturedEnvVars()
        assertTrue(envVars.contains('DD_GIT_REPOSITORY_URL=https://github.com/theorchard/lambda-product-transfer'))
        assertTrue(envVars.contains('DD_GIT_COMMIT_SHA=abc123def456'))
        assertTrue(envVars.contains('DD_GIT_BRANCH=master'))
        assertTrue(envVars.contains('DD_GIT_COMMIT_AUTHOR_NAME=Test Author'))
        assertTrue(envVars.contains('DD_GIT_COMMIT_AUTHOR_EMAIL=test@example.com'))
        assertTrue(envVars.contains('DD_GIT_COMMIT_MESSAGE=Test commit message'))
    }

    @Test
    void testGitAuthorInfoFetchedFromLog() {
        withDatadogTestOptimizationEnv {}

        assertMethodCalledTimes('sh', 3)
        assertMethodCalledNthWith('sh', 0, 'git log -1 --pretty=format:%an')
        assertMethodCalledNthWith('sh', 1, 'git log -1 --pretty=format:%ae')
        assertMethodCalledNthWith('sh', 2, 'git log -1 --pretty=format:%s')
    }
}
