package com.sonymusic

import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

import static org.junit.jupiter.api.Assertions.assertEquals
import static org.junit.jupiter.api.Assertions.assertThrows

class GetModifiedFunctionsTest extends BasePipelineTest {
    def getModifiedFunctions
    def getModifiedPathsArgs

    @BeforeEach
    void setUp() {
        super.setUp()
        getModifiedFunctions = loadScript("vars/getModifiedFunctions.groovy")
        helper.registerAllowedMethod('getModifiedPaths', [Map], { args ->
            getModifiedPathsArgs = args
            return args.paths
        })
    }

    @Test
    void testMissingRequiredArgs() {
        assertThrows(AssertionError.class, {
            getModifiedFunctions.call([:])
        })
    }

    @Test
    void testSuccessWithDefaults() {
        binding.setVariable('env', [
            BRANCH_NAME: 'master',
            GIT_PREVIOUS_SUCCESSFUL_COMMIT: '123456'
        ])

        def result = getModifiedFunctions.call([
            lambdaDirectories: [[path: 'dir1/Dockerfile'],[path: 'dir2/Dockerfile']]
        ])

        assertEquals(['dir1', 'dir2'], result)
        assertEquals([
            branchName: 'master',
            baseCommit: '123456',
            mainBranch: 'master',
            paths: ['dir1/', 'dir2/']
        ], getModifiedPathsArgs)
    }

    @Test
    void testSuccessWithExplicitArguments() {
        def result = getModifiedFunctions.call([
            branchName: 'master',
            previousSuccessfulCommit: '123456',
            lambdaDirectories: [[path: 'dir1/Dockerfile'],[path: 'dir2/Dockerfile']]
        ])

        assertEquals(['dir1', 'dir2'], result)
        assertEquals([
            branchName: 'master',
            baseCommit: '123456',
            mainBranch: 'master',
            paths: ['dir1/', 'dir2/']
        ], getModifiedPathsArgs)
    }

    @Test
    void testMainBranchThreadedThrough() {
        def result = getModifiedFunctions.call([
            branchName: 'feature-branch',
            previousSuccessfulCommit: '123456',
            mainBranch: 'main',
            lambdaDirectories: [[path: 'dir1/Dockerfile'],[path: 'dir2/Dockerfile']]
        ])

        assertEquals(['dir1', 'dir2'], result)
        assertEquals([
            branchName: 'feature-branch',
            baseCommit: '123456',
            mainBranch: 'main',
            paths: ['dir1/', 'dir2/']
        ], getModifiedPathsArgs)
    }
}
