/**
 * 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.9.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.15.0'
    testImplementation 'io.cucumber:cucumber-junit:7.15.0'
    testImplementation 'io.cucumber:cucumber-spring:7.15.0'

    testImplementation 'io.qameta.allure:allure-cucumber7-jvm:2.25.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.30'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.30'

    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.0.1'
    testImplementation "org.apache.avro:avro:1.11.3"
    testImplementation "org.awaitility:awaitility:4.2.0"
    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'
}
