package integration

import integration.steps.then.`And the response should not be null`
import integration.steps.then.`Then the response should be`
import integration.steps.then.`and should contains`
import integration.steps.`when`.`When I send a POST request`
import integration.steps.`when`.`with body`
import integration.steps.given.`Given I have citizen`
import integration.steps.given.`authenticated as`
import integration.steps.then.and
import io.ktor.http.HttpStatusCode.Companion.NoContent
import io.ktor.http.HttpStatusCode.Companion.OK
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestInstance

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Tags(Tag("integration"), Tag("auth"), Tag("login"))
class `Login routes` : BaseTest() {
    @Test
    fun `I can login with username and password`() {
        withIntegrationApplication {
            `Given I have citizen`("Niels", "Bohr")
            `When I send a POST request`("/login") {
                `with body`("""
                {
                  "username": "niels-bohr",
                  "password": "azerty"
                }
                """)
            } `Then the response should be` OK and {
                `And the response should not be null`() `and should contains` "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9."
                //TODO valid requestBody
            }
        }
    }

    @Test
    fun `I can be connect with Passwordless auth`() {
        withIntegrationApplication {
            `Given I have citizen`("Leonhard", "Euler", "fabrice.lecomte.be@gmail.com", id = "c606110c-ff0e-4d09-a79e-74632d7bf7bd")
            `When I send a POST request`("/auth/passwordless") {
                `authenticated as`("Leonhard", "Euler")
                `with body`("""
                {
                  "url": "https://dc-project.fr/password/reset",
                  "email": "fabrice.lecomte.be@gmail.com"
                }
                """)
            } `Then the response should be` NoContent
        }
    }
}
