/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

plugins {
    id 'se.thinkcode.cucumber-runner' version '0.0.11'
    id 'io.qameta.allure' version '2.11.2'
}

apply plugin: 'java'
apply plugin: 'eclipse'

repositories {
    mavenCentral()
}

dependencies {
    testImplementation(project(':fineract-avro-schemas'))
    testImplementation(project(':fineract-client'))
    testImplementation(project(':fineract-e2e-tests-core').sourceSets.test.output)

    testImplementation 'org.springframework:spring-context'
    implementation 'org.springframework:spring-test'
    testImplementation 'org.springframework:spring-jms'

    testImplementation 'com.squareup.retrofit2:retrofit:2.10.0'
    testImplementation 'commons-httpclient:commons-httpclient:3.1'
    testImplementation 'org.apache.commons:commons-lang3:3.14.0'
    testImplementation 'com.googlecode.json-simple:json-simple:1.1.1'
    testImplementation 'com.google.code.gson:gson:2.10.1'

    testImplementation 'io.cucumber:cucumber-java:7.16.1'
    testImplementation 'io.cucumber:cucumber-junit:7.16.1'
    testImplementation 'io.cucumber:cucumber-spring:7.16.1'

    testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.26.0'

    testImplementation 'org.assertj:assertj-core:3.25.3'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.2'
    testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2'

    testCompileOnly 'org.projectlombok:lombok:1.18.32'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.32'

    testImplementation "ch.qos.logback:logback-core:1.5.3"
    testImplementation "ch.qos.logback:logback-classic:1.5.3"

    testImplementation 'org.apache.activemq:activemq-client:6.1.0'
    testImplementation "org.apache.avro:avro:1.11.3"
    testImplementation "org.awaitility:awaitility:4.2.1"
    testImplementation 'io.github.classgraph:classgraph:4.8.168'

    testImplementation 'org.apache.commons:commons-collections4:4.4'
}

tasks.named('test') {
    useJUnitPlatform()
}

tasks.named('cucumber').get().finalizedBy 'allureReport'

tasks.named('cucumber').get().dependsOn 'spotlessCheck'

cucumber {
    tags = 'not @ignore'
    main = 'io.cucumber.core.cli.Main'
    shorten = 'argfile'
    plugin = [
        'pretty',
        'io.qameta.allure.cucumber7jvm.AllureCucumber7Jvm'
    ]
}

allure {
    version = '2.17.3'
}
