package com.sonymusic

import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

import static org.junit.jupiter.api.Assertions.assertNull

class SlackNotifyTest extends BaseGlobalVarTest {
    def slackNotify

    @BeforeEach
    void setUp() {
        super.setUp()
        slackNotify = loadScript("vars/slackNotify.groovy")
        helper.registerAllowedMethod('slackSend', [Map])
        binding.setVariable('env', [
            JOB_NAME: 'job-name',
            BUILD_NUMBER: '1',
            BUILD_URL: 'http://build.url'
        ])
    }

    @Test
    void testCallWithNoArgs() {
        assertThrowsWithMessage(
            IllegalArgumentException.class, 
            "slackNotify: Missing required parameter: 'channel'", 
            { slackNotify.call(message: 'test') }
        )
    }

    @Test
    void testCallWithDefaultsSuccessfulBuild() {
        binding.getVariable('currentBuild').currentResult = 'SUCCESS'

        slackNotify(channel: '#some-slack-channel')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'color=good',
            'message=job-name - #1 SUCCESS'
        ])
    }

    @Test
    void testCallWithDefaultsUnstableBuild() {
        binding.getVariable('currentBuild').currentResult = 'UNSTABLE'

        slackNotify(channel: '#some-slack-channel')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'color=warning',
            'message=job-name - #1 UNSTABLE'
        ])
    }

    @Test
    void testCallWithDefaultsFailedBuild() {
        binding.getVariable('currentBuild').currentResult = 'FAILURE'

        slackNotify(channel: '#some-slack-channel')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'color=danger',
            'message=job-name - #1 FAILURE'
        ])
    }

    @Test
    void testCallWithDefaultsOtherBuildResult() {
        binding.getVariable('currentBuild').currentResult = 'ABORTED'

        slackNotify(channel: '#some-slack-channel')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'message=job-name - #1 ABORTED'
        ])

        assertNull(getMethodCallArgument('slackSend', 'color'))
    }

    @Test
    void testCallWithOverrides() {
        binding.getVariable('currentBuild').currentResult = 'FAILURE'

        slackNotify(channel: '#some-slack-channel', color: '#ffffff', message: 'custom message')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'message=custom message',
            'color=#ffffff'
        ])
    }

    @Test
    void testCallWithStepName() {
        binding.getVariable('currentBuild').currentResult = 'FAILURE'

        slackNotify(channel: '#some-slack-channel', stepName: 'e2e')

        assertMethodCalledOnceWith('slackSend', [
            'channel=#some-slack-channel',
            'message=job-name - #1 (e2e) FAILURE'
        ])
    }
}
