package feature import com.auth0.jwt.JWT import com.auth0.jwt.algorithms.Algorithm import fr.dcproject.JwtConfig import fr.dcproject.entity.Citizen import fr.dcproject.entity.User import fr.postgresjson.connexion.Requester import io.cucumber.datatable.DataTable import io.cucumber.java8.En import io.ktor.http.HttpHeaders import org.joda.time.DateTime import org.koin.test.KoinTest import org.koin.test.get import org.koin.test.inject import java.util.* import java.util.concurrent.CompletionException import kotlin.random.Random import fr.dcproject.repository.Citizen as CitizenRepository class KtorServerAuthSteps: En, KoinTest { private val requester: Requester by inject() init { When("I have citizen:") { body: DataTable -> val user = User(username = "jaque_${Random.nextInt(0, 10000)}", plainPassword = "azerty") requester .getFunction("insert_user") .selectOne(user) val data = body.asMap(String::class.java, String::class.java) val citizen = Citizen( id = UUID.fromString(data["id"]), name = Citizen.Name(data["firstName"], data["lastName"]), birthday = DateTime.now(), user = user ) requester .getFunction("upsert_citizen") .selectOne(citizen) } Given("I am authenticated as {word} {word} with id {string}") { firstName: String, lastName: String, id: String -> val jwtAsString: String = JWT.create() .withIssuer("dc-project.fr") .withClaim("id", id) .sign(Algorithm.HMAC512(JwtConfig.secret)) val user = User( id = UUID.fromString(id), username = "$firstName-$lastName".toLowerCase(), plainPassword = "azerty" ) val citizen = Citizen( id = UUID.fromString(id), name = Citizen.Name(firstName, lastName), birthday = DateTime.now(), user = user ) try { get().insertWithUser(citizen) } catch (e: CompletionException) { // Nothing } KtorServerContext.defaultServer.addPreRequestSetup { addHeader(HttpHeaders.Authorization, "Bearer $jwtAsString") } } Given("I have citizen {word} {word} with id {string}") { firstName: String, lastName: String, id: String -> val user = User( id = UUID.randomUUID(), username = "$firstName-$lastName".toLowerCase(), plainPassword = "azerty" ) val citizen = Citizen( id = UUID.fromString(id), name = Citizen.Name(firstName, lastName), birthday = DateTime.now(), user = user ) try { get().insertWithUser(citizen) } catch (e: CompletionException) { // Nothing } } } }