import groovy.ant.FileNameFinder
import javaposse.jobdsl.dsl.DslScriptLoader
import javaposse.jobdsl.plugin.JenkinsJobManagement
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.Arguments
import org.junit.jupiter.params.provider.MethodSource
import org.jvnet.hudson.test.JenkinsRule
import org.jvnet.hudson.test.junit.jupiter.WithJenkins

import java.nio.file.Path
import java.nio.file.Paths
import java.util.stream.Stream

@WithJenkins
class JobDslScriptTest {
    static JenkinsJobManagement jenkinsJobManagement

    @BeforeAll
    static void setup() {
        def params = [GIT_URL: 'https://github.com/theorchard/jenkins-config.git']
        jenkinsJobManagement = new JenkinsJobManagement(System.out, params, new File('.'))
        jenkinsJobManagement.failOnMissingPlugin = true
    }

    @ParameterizedTest
    @MethodSource("getJobDslScripts")
    void testScripts(File script, JenkinsRule _) {
        println "Running script ${script}"
        new DslScriptLoader(jenkinsJobManagement).runScript(script.text)
    }

    static Stream<Arguments> getJobDslScripts() {
        return new FileNameFinder()
            .getFileNames("..", "*/jobs/**/*.groovy")
            .stream()
            .map(JobDslScriptTest::toRelativePath)
            .map(Path::toFile)
    }

    static Path toRelativePath(String absolutePath) {
        return Paths.get(".").toAbsolutePath().relativize(Paths.get(absolutePath))
    }
}

