Refactoring Follows Tests
Add missing route GET /constitutions/{constitution}/follows
This commit is contained in:
2
.idea/runConfigurations/Follow_Tests.xml
generated
2
.idea/runConfigurations/Follow_Tests.xml
generated
@@ -7,7 +7,7 @@
|
||||
<option name="MAIN_CLASS_NAME" value="RunCucumberTest" />
|
||||
<option name="METHOD_NAME" value="" />
|
||||
<option name="TEST_OBJECT" value="class" />
|
||||
<option name="VM_PARAMETERS" value="-ea -Dcucumber.filter.tags="@follow" -Dstrict" />
|
||||
<option name="VM_PARAMETERS" value="-ea -Dcucumber.filter.tags="@follow"" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="TEST_SEARCH_SCOPE">
|
||||
<value defaultName="wholeProject" />
|
||||
|
||||
@@ -34,9 +34,6 @@ object ConstitutionPaths {
|
||||
@Location("/constitutions/{constitution}")
|
||||
class ConstitutionRequest(val constitution: ConstitutionEntity)
|
||||
|
||||
@Location("/constitutions/{constitution}/follow")
|
||||
class ConstitutionFollowRequest(val constitution: ConstitutionEntity)
|
||||
|
||||
@Location("/constitutions")
|
||||
class PostConstitutionRequest
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepositor
|
||||
|
||||
@KtorExperimentalLocationsAPI
|
||||
object FollowConstitutionPaths {
|
||||
@Location("/constitutions/{constitution}/follow")
|
||||
@Location("/constitutions/{constitution}/follows")
|
||||
class ConstitutionFollowRequest(val constitution: ConstitutionRef)
|
||||
|
||||
@Location("/citizens/{citizen}/follows/constitutions")
|
||||
@@ -38,6 +38,13 @@ fun Route.followConstitution(repo: FollowConstitutionRepository) {
|
||||
call.respond(HttpStatusCode.NoContent)
|
||||
}
|
||||
|
||||
get<FollowConstitutionPaths.ConstitutionFollowRequest> {
|
||||
repo.findFollow(citizen, it.constitution)?.let { follow ->
|
||||
assertCan(VIEW, follow)
|
||||
call.respond(follow)
|
||||
} ?: call.respond(HttpStatusCode.NotFound)
|
||||
}
|
||||
|
||||
get<FollowConstitutionPaths.CitizenFollowConstitutionRequest> {
|
||||
val follows = repo.findByCitizen(it.citizen)
|
||||
assertCan(VIEW, follows.result)
|
||||
|
||||
@@ -27,6 +27,10 @@ class ArticleSteps : En, KoinTest {
|
||||
createArticle(extraData)
|
||||
}
|
||||
|
||||
Given("I have article with ID {string}") { id: String ->
|
||||
createArticle(id = UUID.fromString(id))
|
||||
}
|
||||
|
||||
Given("I have comment created by {word} {word} on article {string}:") { firstName: String, lastName: String, articleId: String, extraData: DataTable? ->
|
||||
commentArticle(articleId, firstName, lastName, extraData)
|
||||
}
|
||||
@@ -35,7 +39,7 @@ class ArticleSteps : En, KoinTest {
|
||||
}
|
||||
}
|
||||
|
||||
private fun createArticle(extraData: DataTable? = null) {
|
||||
private fun createArticle(extraData: DataTable? = null, id: UUID? = null) {
|
||||
val params = extraData?.asMap<String, String>(String::class.java, String::class.java)
|
||||
val createdByUsername = params?.get("createdBy")
|
||||
val username = (createdByUsername ?: "username" + UUID.randomUUID().toString())
|
||||
@@ -60,7 +64,7 @@ class ArticleSteps : En, KoinTest {
|
||||
}
|
||||
|
||||
val article = ArticleEntity(
|
||||
id = params?.get("id")?.toUUID() ?: UUID.randomUUID(),
|
||||
id = id ?: params?.get("id")?.toUUID() ?: UUID.randomUUID(),
|
||||
title = "hello",
|
||||
content = "bla bla bla",
|
||||
description = "A super article",
|
||||
@@ -74,7 +78,9 @@ class ArticleSteps : En, KoinTest {
|
||||
|
||||
val article = get<ArticleRepository>().findById(UUID.fromString(articleId)) ?: error("Article not exist")
|
||||
|
||||
val citizen = get<CitizenRepository>().findByUsername(("$firstName-$lastName".toLowerCase()).toLowerCase().replace(' ', '-')) ?: error("Citizen not exist")
|
||||
val citizen = get<CitizenRepository>().findByUsername(
|
||||
("$firstName-$lastName".toLowerCase()).toLowerCase().replace(' ', '-')
|
||||
) ?: error("Citizen not exist")
|
||||
|
||||
val comment: CommentEntity<ArticleRef> = CommentEntity(
|
||||
id = params?.get("id")?.let { UUID.fromString(it) } ?: UUID.randomUUID(),
|
||||
|
||||
@@ -9,11 +9,10 @@ import org.joda.time.DateTime
|
||||
import org.koin.test.KoinTest
|
||||
import org.koin.test.get
|
||||
import java.util.*
|
||||
import fr.dcproject.entity.Constitution as ConstitutionEntity
|
||||
import fr.dcproject.entity.Comment as CommentEntity
|
||||
import fr.dcproject.entity.User as UserEntity
|
||||
import fr.dcproject.repository.Constitution as ConstitutionRepository
|
||||
import fr.dcproject.repository.Citizen as CitizenRepository
|
||||
import fr.dcproject.repository.Constitution as ConstitutionRepository
|
||||
|
||||
class ConstitutionSteps : En, KoinTest {
|
||||
init {
|
||||
@@ -27,6 +26,10 @@ class ConstitutionSteps : En, KoinTest {
|
||||
createConstitution(extraData)
|
||||
}
|
||||
|
||||
Given("I have constitution with ID {string}") { id: String? ->
|
||||
createConstitution(id = UUID.fromString(id))
|
||||
}
|
||||
|
||||
Given("I have comment created by {word} {word} on constitution {string}:") { firstName: String, lastName: String, constitutionId: String, extraData: DataTable? ->
|
||||
commentConstitution(constitutionId, firstName, lastName, extraData)
|
||||
}
|
||||
@@ -35,7 +38,7 @@ class ConstitutionSteps : En, KoinTest {
|
||||
}
|
||||
}
|
||||
|
||||
private fun createConstitution(extraData: DataTable? = null) {
|
||||
private fun createConstitution(extraData: DataTable? = null, id: UUID? = null) {
|
||||
val params = extraData?.asMap<String, String>(String::class.java, String::class.java)
|
||||
val createdByUsername = params?.get("createdBy")
|
||||
val username = (createdByUsername ?: "username"+UUID.randomUUID().toString())
|
||||
@@ -64,7 +67,7 @@ class ConstitutionSteps : En, KoinTest {
|
||||
)
|
||||
|
||||
val constitution = ConstitutionSimple<CitizenSimple, ConstitutionSimple.TitleSimple<ArticleRef>>(
|
||||
id = params?.get("id")?.toUUID() ?: UUID.randomUUID(),
|
||||
id = id ?: params?.get("id")?.toUUID() ?: UUID.randomUUID(),
|
||||
title = "hello",
|
||||
titles = mutableListOf(title1),
|
||||
anonymous = false,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package feature
|
||||
|
||||
import fr.dcproject.entity.ArticleRef
|
||||
import fr.dcproject.entity.ConstitutionRef
|
||||
import fr.dcproject.entity.Follow
|
||||
import fr.dcproject.utils.toUUID
|
||||
import io.cucumber.java8.En
|
||||
@@ -8,14 +9,21 @@ import org.koin.test.KoinTest
|
||||
import org.koin.test.get
|
||||
import fr.dcproject.repository.Citizen as CitizenRepository
|
||||
import fr.dcproject.repository.FollowArticle as FollowArticleRepository
|
||||
import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository
|
||||
|
||||
class FollowSteps : En, KoinTest {
|
||||
init {
|
||||
Given("The citizen {word} {word} follow article {string}") { firstName: String, lastName: String, articleId: String ->
|
||||
Given("I have follow of {word} {word} on article {string}") { firstName: String, lastName: String, articleId: String ->
|
||||
val username = "$firstName-$lastName".toLowerCase()
|
||||
val citizen = get<CitizenRepository>().findByUsername(username) ?: error("Citizen not exist")
|
||||
val follow = Follow(createdBy = citizen, target = ArticleRef(articleId.toUUID()))
|
||||
get<FollowArticleRepository>().follow(follow)
|
||||
}
|
||||
Given("I have follow of {word} {word} on constitution {string}") { firstName: String, lastName: String, constitutionId: String ->
|
||||
val username = "$firstName-$lastName".toLowerCase()
|
||||
val citizen = get<CitizenRepository>().findByUsername(username) ?: error("Citizen not exist")
|
||||
val follow = Follow(createdBy = citizen, target = ConstitutionRef(constitutionId.toUUID()))
|
||||
get<FollowConstitutionRepository>().follow(follow)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
@follow
|
||||
Feature: follow Article and Constitution
|
||||
|
||||
# Article
|
||||
Scenario: The route for follow article must response a 201 and return object
|
||||
Given I am authenticated as John Doe with id "64b7b379-2298-43ec-b428-ba134930cabd"
|
||||
When I send a POST request to "/articles/9226c1a3-8091-c3fa-7d0d-c2e98c9bee7b/follows"
|
||||
Then the response status code should be 201
|
||||
|
||||
Scenario: The route for get follows of articles must response a 200 and return objects
|
||||
Given I have citizen John Smith with id "e3c0b08c-11be-418e-95e0-8596b4402feb"
|
||||
When I send a GET request to "/citizens/e3c0b08c-11be-418e-95e0-8596b4402feb/follows/articles"
|
||||
Then the response status code should be 200
|
||||
And the response should contain object:
|
||||
| current_page | 1 |
|
||||
| limit | 50 |
|
||||
|
||||
Scenario: The route for unfollow article must response a 204
|
||||
Given I am authenticated as John Doe with id "64b7b379-2298-43ec-b428-ba134930cabd"
|
||||
When I send a DELETE request to "/articles/9226c1a3-8091-c3fa-7d0d-c2e98c9bee7b/follows"
|
||||
Then the response status code should be 204
|
||||
|
||||
# Constitution
|
||||
Scenario: The route for follow constitution must response a 201 and return object
|
||||
Given I am authenticated as John Doe with id "64b7b379-2298-43ec-b428-ba134930cabd"
|
||||
When I send a POST request to "/constitutions/72aa1ee1-4963-eb44-c9e0-5ce6e0f18f00/follow"
|
||||
Then the response status code should be 201
|
||||
|
||||
Scenario: The route for get follows of constitutions must response a 200 and return objects
|
||||
Given I have citizen John Smith with id "e3c0b08c-11be-418e-95e0-8596b4402feb"
|
||||
When I send a GET request to "/citizens/e3c0b08c-11be-418e-95e0-8596b4402feb/follows/constitutions"
|
||||
Then the response status code should be 200
|
||||
And the response should contain object:
|
||||
| current_page | 1 |
|
||||
| limit | 50 |
|
||||
|
||||
Scenario: The route for unfollow constitution must response a 204
|
||||
Given I am authenticated as John Doe with id "64b7b379-2298-43ec-b428-ba134930cabd"
|
||||
When I send a DELETE request to "/constitutions/72aa1ee1-4963-eb44-c9e0-5ce6e0f18f00/follow"
|
||||
Then the response status code should be 204
|
||||
|
||||
Scenario: I can know if I follow an article
|
||||
Given I have article with id "3ee4e6d0-f312-4940-872d-1f578c8d824c"
|
||||
And I have citizen Marie Curie
|
||||
And I am authenticated as Marie Curie
|
||||
And The citizen Marie Curie follow article "3ee4e6d0-f312-4940-872d-1f578c8d824c"
|
||||
When I send a GET request to "/articles/3ee4e6d0-f312-4940-872d-1f578c8d824c/follows"
|
||||
Then the response status code should be 200
|
||||
And the JSON should contain:
|
||||
| target.id | 3ee4e6d0-f312-4940-872d-1f578c8d824c |
|
||||
42
src/test/resources/feature/followArticle.feature
Normal file
42
src/test/resources/feature/followArticle.feature
Normal file
@@ -0,0 +1,42 @@
|
||||
@follow
|
||||
Feature: follow Article
|
||||
|
||||
# Article
|
||||
Scenario: The route for follow article must response a 201 and return
|
||||
Given I have citizen Louis Pasteur
|
||||
And I am authenticated as Louis Pasteur
|
||||
And I have article
|
||||
| id | 04754b7b-edef-4adc-af81-75e3aadeebea |
|
||||
When I send a POST request to "/articles/04754b7b-edef-4adc-af81-75e3aadeebea/follows"
|
||||
Then the response status code should be 201
|
||||
|
||||
Scenario: The route for get follows of articles must response a 200 and return objects
|
||||
Given I have citizen Johannes Kepler with ID "e4592d53-3660-4264-8353-ebdbf5d9c41c"
|
||||
And I am authenticated as Johannes Kepler
|
||||
And I have article
|
||||
| id | d743619a-1f6b-4d20-a2d6-8e81f0e6a4c8 |
|
||||
And I have follow of Johannes Kepler on article "d743619a-1f6b-4d20-a2d6-8e81f0e6a4c8"
|
||||
When I send a GET request to "/citizens/e4592d53-3660-4264-8353-ebdbf5d9c41c/follows/articles"
|
||||
Then the response status code should be 200
|
||||
And the response should contain object:
|
||||
| current_page | 1 |
|
||||
| limit | 50 |
|
||||
|
||||
Scenario: The route for unfollow article must response a 204
|
||||
Given I have citizen Thomas Edison
|
||||
And I am authenticated as Thomas Edison
|
||||
And I have article
|
||||
| id | aad3aa9d-95fd-4919-9e84-46255f620e31 |
|
||||
And I have follow of Thomas Edison on article "aad3aa9d-95fd-4919-9e84-46255f620e31"
|
||||
When I send a DELETE request to "/articles/aad3aa9d-95fd-4919-9e84-46255f620e31/follows"
|
||||
Then the response status code should be 204
|
||||
|
||||
Scenario: I can know if I follow an article
|
||||
Given I have article with ID "3ee4e6d0-f312-4940-872d-1f578c8d824c"
|
||||
And I have citizen Marie Curie
|
||||
And I am authenticated as Marie Curie
|
||||
And I have follow of Marie Curie on article "3ee4e6d0-f312-4940-872d-1f578c8d824c"
|
||||
When I send a GET request to "/articles/3ee4e6d0-f312-4940-872d-1f578c8d824c/follows"
|
||||
Then the response status code should be 200
|
||||
And the JSON should contain:
|
||||
| target.id | 3ee4e6d0-f312-4940-872d-1f578c8d824c |
|
||||
42
src/test/resources/feature/followConstitution.feature
Normal file
42
src/test/resources/feature/followConstitution.feature
Normal file
@@ -0,0 +1,42 @@
|
||||
@follow
|
||||
Feature: follow Constitution
|
||||
|
||||
# Constitution
|
||||
Scenario: The route for follow constitution must response a 201 and return
|
||||
Given I have citizen Dmitri Mendeleïev
|
||||
And I am authenticated as Dmitri Mendeleïev
|
||||
And I have constitution
|
||||
| id | f6553f5e-0cf5-476a-b84e-15e52ec9d8f9 |
|
||||
When I send a POST request to "/constitutions/f6553f5e-0cf5-476a-b84e-15e52ec9d8f9/follows"
|
||||
Then the response status code should be 201
|
||||
|
||||
Scenario: The route for get follows of constitutions must response a 200 and return objects
|
||||
Given I have citizen André-Marie Ampère with ID "877b45b0-302d-487d-8944-6d03ccdbd0f8"
|
||||
And I am authenticated as André-Marie Ampère
|
||||
And I have constitution
|
||||
| id | 7f642078-8e74-47fc-9712-0c37531674a0 |
|
||||
And I have follow of André-Marie Ampère on constitution "7f642078-8e74-47fc-9712-0c37531674a0"
|
||||
When I send a GET request to "/citizens/877b45b0-302d-487d-8944-6d03ccdbd0f8/follows/constitutions"
|
||||
Then the response status code should be 200
|
||||
And the response should contain object:
|
||||
| current_page | 1 |
|
||||
| limit | 50 |
|
||||
|
||||
Scenario: The route for unfollow constitution must response a 204
|
||||
Given I have citizen Claude Ptolémée
|
||||
And I am authenticated as Claude Ptolémée
|
||||
And I have constitution
|
||||
| id | 4ea03776-a28c-4202-9b90-db1b942946c1 |
|
||||
And I have follow of Claude Ptolémée on constitution "4ea03776-a28c-4202-9b90-db1b942946c1"
|
||||
When I send a DELETE request to "/constitutions/4ea03776-a28c-4202-9b90-db1b942946c1/follows"
|
||||
Then the response status code should be 204
|
||||
|
||||
Scenario: I can know if I follow an constitution
|
||||
Given I have constitution with ID "5141e781-ebcd-4de0-8c2b-7d23d4cd58b5"
|
||||
And I have citizen Denis Papin
|
||||
And I am authenticated as Denis Papin
|
||||
And I have follow of Denis Papin on constitution "5141e781-ebcd-4de0-8c2b-7d23d4cd58b5"
|
||||
When I send a GET request to "/constitutions/5141e781-ebcd-4de0-8c2b-7d23d4cd58b5/follows"
|
||||
Then the response status code should be 200
|
||||
And the JSON should contain:
|
||||
| target.id | 5141e781-ebcd-4de0-8c2b-7d23d4cd58b5 |
|
||||
Reference in New Issue
Block a user