import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import util.BasePiperTest
import util.JenkinsLoggingRule
import util.JenkinsReadYamlRule
import util.JenkinsStepRule
import util.Rules

import static org.hamcrest.Matchers.*
import static org.junit.Assert.assertThat

class HealthExecuteCheckTest extends BasePiperTest {
    private JenkinsStepRule stepRule = new JenkinsStepRule(this)
    private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
    private ExpectedException thrown = ExpectedException.none()

    @Rule
    public RuleChain rules = Rules
        .getCommonRules(this)
        .around(new JenkinsReadYamlRule(this))
        .around(loggingRule)
        .around(stepRule)
        .around(thrown)


    @Before
    void init() throws Exception {
        // register Jenkins commands with mock values
        def command1 = "curl -so /dev/null -w '%{response_code}' http://testserver"
        def command2 = "curl -so /dev/null -w '%{response_code}' http://testserver/endpoint"
        helper.registerAllowedMethod('sh', [Map.class], {map ->
            return map.script == command1 || map.script == command2 ? "200" : "404"
        })
    }

    @Test
    void testHealthCheckOk() throws Exception {
        def testUrl = 'http://testserver/endpoint'

        stepRule.step.healthExecuteCheck(
            script: nullScript,
            testServerUrl: testUrl
        )

        assertThat(loggingRule.log, containsString("Health check for ${testUrl} successful"))
    }

    @Test
    void testHealthCheck404() throws Exception {
        def testUrl = 'http://testserver/404'

        thrown.expect(Exception)
        thrown.expectMessage('Health check failed: 404')

        stepRule.step.healthExecuteCheck(
            script: nullScript,
            testServerUrl: testUrl
        )
    }


    @Test
    void testHealthCheckWithEndPoint() throws Exception {
        stepRule.step.healthExecuteCheck(
            script: nullScript,
            testServerUrl: 'http://testserver',
            healthEndpoint: 'endpoint'
        )

        assertThat(loggingRule.log, containsString("Health check for http://testserver/endpoint successful"))
    }

    @Test
    void testHealthCheckWithEndPointTrailingSlash() throws Exception {
        stepRule.step.healthExecuteCheck(
            script: nullScript,
            testServerUrl: 'http://testserver/',
            healthEndpoint: 'endpoint'
        )

        assertThat(loggingRule.log, containsString("Health check for http://testserver/endpoint successful"))
    }

}
