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.*

class GraphqlPushSchemaTest extends BasePipelineTest {
    def graphqlPushSchema
    def ecrAccountId = '1234567890'
    def imageName = 'service'

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

        binding.getVariable('env') << [
            WORKSPACE: '/var/lib/jenkins/workspace/jenkins-global-libraries'
        ]
    }

    @Test
    void testCallWithNoArgs() {
        // Assert error is thrown since required args are not supplied
        assertThrows(AssertionError.class, {
            graphqlPushSchema.call(dummy: 'dummy')
        })
    }

    @Test
    void testCallSuccess() {
        // This one should succeed and return nothing
        assertNull(graphqlPushSchema(
            environment: 'dev',
            roverOperation: 'check',
            serviceName: 'graphql-service'
        ))

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

        assertEquals(1, shSteps.size())

        def shArgs = shSteps[0].argsToString().trim()
        assertThat(shArgs, containsString('timeout 300'))
        assertThat(shArgs, containsString('-v "/var/lib/jenkins/workspace/jenkins-global-libraries/src/schema:/var/app/src/schema"'))
        assertThat(shArgs, containsString('-e APOLLO_KEY="service:graphql-theorchard:${APOLLO_KEY}"'))
        assertThat(shArgs, containsString('-e ENV="dev"'))
        assertThat(shArgs, containsString('-e ROVER_OPERATION="check"'))
        assertThat(shArgs, containsString('-e SERVICE_NAME="graphql-service"'))
        assertThat(shArgs, endsWith('086679231553.dkr.ecr.us-east-1.amazonaws.com/graphql-rover-utility:latest'))
    }

    @Test
    void testCallWithOverrideOptions() {
        assertNull(graphqlPushSchema(
            environment: 'dev',
            dockerImage: '1234.docker.com/image:latest',
            roverOperation: 'check',
            runTimeout: '60',
            serviceName: 'graphql-service',
            schemaDirectory: './schemaDir'

        ))

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

        assertEquals(1, shSteps.size())

        def shArgs = shSteps[0].argsToString().trim()
        assertThat(shArgs, containsString('timeout 60'))
        assertThat(shArgs, containsString('-v "./schemaDir:/var/app/src/schema"'))
        assertThat(shArgs, containsString('-e APOLLO_KEY="service:graphql-theorchard:${APOLLO_KEY}"'))
        assertThat(shArgs, containsString('-e ENV="dev"'))
        assertThat(shArgs, containsString('-e ROVER_OPERATION="check"'))
        assertThat(shArgs, containsString('-e SERVICE_NAME="graphql-service"'))
        assertThat(shArgs, endsWith('1234.docker.com/image:latest'))
    }
}