package com.sonymusic

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

import static org.hamcrest.CoreMatchers.endsWith
import static org.hamcrest.MatcherAssert.assertThat
import static org.hamcrest.core.StringContains.containsString
import static org.junit.jupiter.api.Assertions.assertEquals
import static org.junit.jupiter.api.Assertions.assertNotNull

class TerraformScanTest extends BasePipelineTest {
    def terraformScan

    @BeforeEach
    void setUp() {
        super.setUp()
        terraformScan = loadScript("vars/terraformScan.groovy")
        helper.registerAllowedMethod('sh', [Map])
        helper.registerAllowedMethod('withEcr', [Closure])
        helper.registerAllowedMethod('file', [LinkedHashMap])

        binding.getVariable('env') << [
            CHANGE_ID: '24',
            GIT_URL: 'https://github.com/theorchard/jenkins-global-libraries.git',
            WORKSPACE: '/var/lib/jenkins/workspace/jenkins-global-libraries'
        ]
    }

    @Test
    void testCallWithNoArgs() {
        terraformScan()

        def shSteps = helper.callStack.findAll{ call ->
            call.methodName == 'sh'
        }

        assertEquals(2, shSteps.size())

        def checkovScanStep = shSteps.find{ it.argsToString().contains('terraform-static-code-analysis') }
        assertNotNull(checkovScanStep)
        def checkovScanArgs = checkovScanStep.argsToString().trim()
        assertThat(checkovScanArgs, containsString('-v "/var/lib/jenkins/workspace/jenkins-global-libraries:/repository"'))
        assertThat(checkovScanArgs, containsString('-e GITHUB_REPO_NAME="theorchard/jenkins-global-libraries"'))
        assertThat(checkovScanArgs, containsString('-e GITHUB_PR_NUM="24"'))
        assertThat(checkovScanArgs, containsString('-e AWS_ROLES_PER_PREFIX="dev=arn:aws:iam::103233932089:role/dev-checkov-access-role,qa=arn:aws:iam::437795906767:role/prod-checkov-access-role,prod=arn:aws:iam::437795906767:role/prod-checkov-access-role"'))
        assertThat(checkovScanArgs, endsWith('437795906767.dkr.ecr.us-east-1.amazonaws.com/terraform-static-code-analysis:latest'))
    }

    @Test
    void testCallWithCustomImageTag() {
        terraformScan(checkovImageTag: 'staging')

        def shSteps = helper.callStack.findAll{ call ->
            call.methodName == 'sh'
        }

        assertEquals(2, shSteps.size())

        def checkovScanStep = shSteps.find{ it.argsToString().contains('terraform-static-code-analysis') }
        assertNotNull(checkovScanStep)
        def checkovScanArgs = checkovScanStep.argsToString().trim()
        assertThat(checkovScanArgs, containsString('-v "/var/lib/jenkins/workspace/jenkins-global-libraries:/repository"'))
        assertThat(checkovScanArgs, containsString('-e GITHUB_REPO_NAME="theorchard/jenkins-global-libraries"'))
        assertThat(checkovScanArgs, containsString('-e GITHUB_PR_NUM="24"'))
        assertThat(checkovScanArgs, containsString('-e AWS_ROLES_PER_PREFIX="dev=arn:aws:iam::103233932089:role/dev-checkov-access-role,qa=arn:aws:iam::437795906767:role/prod-checkov-access-role,prod=arn:aws:iam::437795906767:role/prod-checkov-access-role"'))
        assertThat(checkovScanArgs, endsWith('437795906767.dkr.ecr.us-east-1.amazonaws.com/terraform-static-code-analysis:staging'))
    }
}
