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

class GetModifiedPathsTest extends BasePipelineTest {
    def getModifiedPaths

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

    @Test
    void testBranchIsMasterAndNoBaseCommit() {
        helper.addShMock('git hash-object -t tree /dev/null', '654321', 0)
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'master',
            baseCommit: null,
        ])

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testBranchIsMasterAndBaseCommitProvided() {
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'master',
            baseCommit: '654321',
        ])

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testBranchIsNotMaster() {
        helper.addShMock('git merge-base HEAD origin/master', '654321', 0)
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'feature-branch',
        ])

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testDefaultArgValues() {
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        binding.getVariable('env')['BRANCH_NAME'] = 'master'
        binding.getVariable('env')['GIT_PREVIOUS_SUCCESSFUL_COMMIT'] = '654321'

        def result = getModifiedPaths()

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testBranchIsMainWhenMainBranchOverridden() {
        helper.addShMock('git hash-object -t tree /dev/null', '654321', 0)
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'main',
            baseCommit: null,
            mainBranch: 'main',
        ])

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testBranchIsNotMainComparesAgainstMainBranch() {
        helper.addShMock('git merge-base HEAD origin/main', '654321', 0)
        helper.addShMock('git diff --name-only 654321..HEAD', 'file1.txt\nfile2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'feature-branch',
            mainBranch: 'main',
        ])

        assertEquals(['file1.txt', 'file2.txt'], result)
    }

    @Test
    void testWithPathFilter() {
        helper.addShMock('git diff --name-only 654321..HEAD', 'dir1/file1.txt\ndir2/file2.txt', 0)

        def result = getModifiedPaths([
            branchName: 'master',
            baseCommit: '654321',
            paths: ['dir1']
        ])

        assertEquals(['dir1'], result)
    }
}
