feature #9: Create route for register
This commit is contained in:
@@ -145,7 +145,7 @@ fun Application.module() {
|
|||||||
// trace { application.log.trace(it.buildText()) }
|
// trace { application.log.trace(it.buildText()) }
|
||||||
authenticate(optional = true) {
|
authenticate(optional = true) {
|
||||||
article(get())
|
article(get())
|
||||||
auth(get())
|
auth(get(), get())
|
||||||
citizen(get())
|
citizen(get())
|
||||||
constitution(get())
|
constitution(get())
|
||||||
followArticle(get())
|
followArticle(get())
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
|
|||||||
.selectOne("resource" to citizen)
|
.selectOne("resource" to citizen)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createWithUser(citizen: CitizenEntity): CitizenEntity? {
|
fun insertWithUser(citizen: CitizenEntity): CitizenEntity? {
|
||||||
return requester
|
return requester
|
||||||
.getFunction("insert_citizen_with_user")
|
.getFunction("insert_citizen_with_user")
|
||||||
.selectOne("resource" to citizen)
|
.selectOne("resource" to citizen)
|
||||||
|
|||||||
@@ -12,18 +12,27 @@ import io.ktor.request.receive
|
|||||||
import io.ktor.response.respondText
|
import io.ktor.response.respondText
|
||||||
import io.ktor.routing.Route
|
import io.ktor.routing.Route
|
||||||
import io.ktor.util.KtorExperimentalAPI
|
import io.ktor.util.KtorExperimentalAPI
|
||||||
|
import fr.dcproject.entity.Citizen as CitizenEntity
|
||||||
|
import fr.dcproject.repository.Citizen as CitizenRepository
|
||||||
import fr.dcproject.repository.User as UserRepository
|
import fr.dcproject.repository.User as UserRepository
|
||||||
|
|
||||||
@KtorExperimentalLocationsAPI
|
@KtorExperimentalLocationsAPI
|
||||||
@KtorExperimentalAPI
|
@KtorExperimentalAPI
|
||||||
fun Route.auth(repo: UserRepository) {
|
fun Route.auth(userRepo: UserRepository, citizenRepo: CitizenRepository) {
|
||||||
post <Paths.LoginRequest> {
|
post <Paths.LoginRequest> {
|
||||||
try {
|
try {
|
||||||
val credentials = call.receive<UserPasswordCredential>()
|
val credentials = call.receive<UserPasswordCredential>()
|
||||||
val user = repo.findByCredentials(credentials) ?: throw BadRequestException("Username not exist or password is wrong")
|
val user = userRepo.findByCredentials(credentials) ?: throw BadRequestException("Username not exist or password is wrong")
|
||||||
call.respondText(JwtConfig.makeToken(user))
|
call.respondText(JwtConfig.makeToken(user))
|
||||||
} catch (e: MismatchedInputException) {
|
} catch (e: MismatchedInputException) {
|
||||||
throw BadRequestException("You must be send name and password to the request")
|
throw BadRequestException("You must be send name and password to the request")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
post <Paths.RegisterRequest> {
|
||||||
|
val citizen = call.receive<CitizenEntity>()
|
||||||
|
val created = citizenRepo.insertWithUser(citizen)?.user ?: throw BadRequestException("Bad request")
|
||||||
|
|
||||||
|
call.respondText(JwtConfig.makeToken(created))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import io.ktor.locations.Location
|
|||||||
@KtorExperimentalLocationsAPI
|
@KtorExperimentalLocationsAPI
|
||||||
object Paths {
|
object Paths {
|
||||||
@Location("/login") class LoginRequest
|
@Location("/login") class LoginRequest
|
||||||
|
@Location("/register") class RegisterRequest
|
||||||
|
|
||||||
@Location("/articles") class ArticlesRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: Direction? = null, val search: String? = null) {
|
@Location("/articles") class ArticlesRequest(page: Int = 1, limit: Int = 50, val sort: String? = null, val direction: Direction? = null, val search: String? = null) {
|
||||||
val page: Int = if (page < 1) 1 else page
|
val page: Int = if (page < 1) 1 else page
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import kotlinx.serialization.json.JsonElement
|
|||||||
import kotlinx.serialization.json.JsonPrimitive
|
import kotlinx.serialization.json.JsonPrimitive
|
||||||
import kotlinx.serialization.parse
|
import kotlinx.serialization.parse
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
import kotlin.test.assertTrue
|
||||||
import kotlin.test.fail
|
import kotlin.test.fail
|
||||||
|
|
||||||
@ImplicitReflectionSerializer
|
@ImplicitReflectionSerializer
|
||||||
@@ -30,6 +31,14 @@ class KtorServerRestSteps : En {
|
|||||||
val jsonArray = responseJsonElement as? JsonArray ?: fail("The json response isn't array")
|
val jsonArray = responseJsonElement as? JsonArray ?: fail("The json response isn't array")
|
||||||
assertEquals(count, jsonArray.size)
|
assertEquals(count, jsonArray.size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Then("the Response should be:") { body: String ->
|
||||||
|
assertEquals(body, response)
|
||||||
|
}
|
||||||
|
|
||||||
|
Then("the Response should contain:") { body: String ->
|
||||||
|
assertTrue(response.contains(body))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findJsonElement(node: String): JsonElement {
|
private fun findJsonElement(node: String): JsonElement {
|
||||||
@@ -52,4 +61,7 @@ class KtorServerRestSteps : En {
|
|||||||
|
|
||||||
private val responseJsonElement: JsonElement
|
private val responseJsonElement: JsonElement
|
||||||
get() = Json.parse(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON"))
|
get() = Json.parse(KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid JSON"))
|
||||||
|
|
||||||
|
private val response: String
|
||||||
|
get() = KtorServerContext.defaultServer.call?.response?.content ?: fail("The response isn't valid")
|
||||||
}
|
}
|
||||||
|
|||||||
33
src/test/resources/feature/auth.feature
Normal file
33
src/test/resources/feature/auth.feature
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
Feature: Auth routes
|
||||||
|
|
||||||
|
Scenario: The route for create citizen must response a 200 and return object
|
||||||
|
When I send a POST request to "/register" with body:
|
||||||
|
"""
|
||||||
|
{
|
||||||
|
"name": {"first_name":"George", "last_name":"MICHEL"},
|
||||||
|
"birthday": "2001-01-01",
|
||||||
|
"user":{
|
||||||
|
"username": "george-junior",
|
||||||
|
"plain_password": "azerty"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
Then the response status code should be 200
|
||||||
|
And the Response should contain:
|
||||||
|
"""
|
||||||
|
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.
|
||||||
|
"""
|
||||||
|
|
||||||
|
Scenario: The route for create citizen must response a 200 and return object
|
||||||
|
When I send a POST request to "/login" with body:
|
||||||
|
"""
|
||||||
|
{
|
||||||
|
"name": "username1",
|
||||||
|
"password": "azerty"
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
Then the response status code should be 200
|
||||||
|
And the Response should contain:
|
||||||
|
"""
|
||||||
|
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.
|
||||||
|
"""
|
||||||
Reference in New Issue
Block a user