This is an automated email from the git hooks/post-receive script. New commit to branch bow-v2 in repository bow. See https://gitlab.nuiton.org/chorem/bow.git commit 9e4eb96ee3679babb490fe7ec38bc324f6b7479d Author: Benjamin <poussin@codelutin.com> Date: Wed Jul 24 01:49:34 2019 +0200 test unitaire pour BowUser: ok ajout interface web pour bowUser (list, edit, create) --- TODO.md | 44 ++++++++++++ log/bookmarks.log | 0 src/main/java/com/chorem/bow/BowApp.java | 40 +++++++++++ .../com/chorem/bow/model/AuthenticationInfo.java | 6 +- src/main/java/com/chorem/bow/model/BowUser.java | 2 + .../bow/repositories/BookmarkRepository.java | 20 +++++- .../chorem/bow/repositories/BowUserRepository.java | 51 +++++++------ .../java/com/chorem/bow/rest/BowUserResources.java | 23 +++++- .../resources/db/migration/V1__init_schema.sql | 3 + src/main/templates/views/editUser.rocker.html | 25 +++++++ src/main/templates/views/index.rocker.html | 2 + src/main/templates/views/listUsers.rocker.html | 10 +++ src/main/templates/views/main.rocker.html | 12 ++++ src/test/java/com/chorem/bow/BowAppTest.java | 13 ++-- .../com/chorem/bow/rest/BowUserResourcesTest.java | 83 ++++++++++++++++------ 15 files changed, 278 insertions(+), 56 deletions(-) diff --git a/TODO.md b/TODO.md index cad8255..6e9003c 100644 --- a/TODO.md +++ b/TODO.md @@ -7,3 +7,47 @@ Database - il faut que bowUser.emails soit unique sur tous les utilisateurs - il faut que bookmark.publicAlias soit unique sur tous les utilisateurs + + +Feature +======= + +Ajouter un date de validité au token (surtout utile pour les pseudo user) + +Lorsqu'on met un @nom cela revient a utiliser un groupe privé automatiquement créer s'il n'existe pas + +On peut créer un #group. L'interface +d'admin permet d'ajouter des users du system (ce qui demande l'authorisation +à l'autre user pour être ajouté). Par configuration, l'interface peut ou non +permettre de lister les autres utilisateurs (installation en entreprise), mais +quoi qu'il arrive si un utilisateur est deja dans un des groupes il sera lister +pour aider la saisie. +Lorsque l'utilisateur accepter de rentrer dans un groupe, il peut aussi indiquer +que la personne qui invite peut le mettre maintenant dans autant de groupe quelle +veut sans que l'utilisateur soit a nouveau solicité. +On peut voir tous les groupes pour lequel on est invité mais pas encore accepter, +et tous les groupes auquels on appartient. +Il est possible de définir un group comme 'public' dans ce cas il peut-etre +recherché par tous les autres utilisateurs et ils peuvent faire la demande pour +y être accepté ou etre accepter automatiquement. + + +Group: +- UUID id +- String name (il ne peut y avoir qu'un seul group public avec le meme nom et donc a qui appartient l'url public, les autres utilisent leur id) +- String description +- {token: UUID, name: String, expirationDate: Date} token (permet des non utilisateurs de bow de voir les bookmarks) +- Set<BowUser> admin (au moins la personne qui la créé, il doit toujours y avoir au moins 1 admin) +- Set<BowUser> writer (les personnes qui ont le droit d'utiliser #group dans leur tags) +- Set<BowUser> reader (les personnes qui n'ont un acces qu'en lecture au bookmark, s'il utilise #group, + cela créera un group privé pour eux, se group ne pourra pas passer public + s'ils deviennent writer ou admin du group public, leur bookmark sont automatiquement enrolé dans le group public ) +- Set<BowUser> invite (l'invité n'a pas encore accepté) +- Set<BowUser> toModerate (admin n'a pas encore accepté cette utilisateurs) +- boolean advertised (si true alors ce groupe est listé dans la liste des groupes) +- boolean public (si true alors les bookmarks sont directement visible (lecture seule) sans authentification: https://bookmarks.cl/group/MonGroup) +- boolean moderated ((utile que si 'public' est vrai) false alors les utilisateurs qui demande a venir dans le groupe son accepté automatiquement) +- Enum memberDefaultVisiblity (ALL, MEMBER, ADMIN) +- Set<BowUser> restrictiveVisibility (la liste des membres qui veulent que seul l'admin puisse les voir dans la liste des membres) + +bookmarks.cl/group/MonGroup \ No newline at end of file diff --git a/log/bookmarks.log b/log/bookmarks.log deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/chorem/bow/BowApp.java b/src/main/java/com/chorem/bow/BowApp.java index 6e7c2b3..428525b 100644 --- a/src/main/java/com/chorem/bow/BowApp.java +++ b/src/main/java/com/chorem/bow/BowApp.java @@ -1,5 +1,7 @@ package com.chorem.bow; +import com.chorem.bow.model.BowUser; +import com.chorem.bow.repositories.BowUserRepository; import com.chorem.bow.rest.BookmarkResources; import com.chorem.bow.rest.BowUserResources; import com.chorem.spgeed.SpgeedModule; @@ -11,6 +13,10 @@ import io.jooby.flyway.FlywayModule; import io.jooby.hikari.HikariModule; import io.jooby.json.JacksonModule; import io.jooby.rocker.RockerModule; +import org.nuiton.spgeed.SqlSession; + +import java.util.List; +import java.util.UUID; /** * @author jooby generator @@ -34,6 +40,40 @@ public class BowApp extends Jooby { get("/", ctx -> views.index.template("Rocker")); + get("/listUsers", ctx -> { + List<BowUser> users; + try (SqlSession session = require(SqlSession.class)) { + BowUserRepository repo = session.getDao(BowUserRepository.class); + users = repo.findAll(); + } + return views.listUsers.template(users); + }); + + get("/editUser", ctx -> { + BowUser user; + if (ctx.query("id").isMissing()) { + user = new BowUser(); + } else { + UUID id = ctx.query("id").to(UUID.class); + try (SqlSession session = require(SqlSession.class)) { + BowUserRepository repo = session.getDao(BowUserRepository.class); + user = repo.find(id); + } + } + return views.editUser.template(user); + }); + + post("/editUser", ctx -> { + BowUser user = ctx.form(BowUser.class); + getLog().debug("upsert user: " + user); + try (SqlSession session = require(SqlSession.class)) { + BowUserRepository repo = session.getDao(BowUserRepository.class); + BowUser upsert = repo.upsert(user); + ctx.sendRedirect("/"); + return upsert; + } + }); + } public static void main(final String[] args) { diff --git a/src/main/java/com/chorem/bow/model/AuthenticationInfo.java b/src/main/java/com/chorem/bow/model/AuthenticationInfo.java index 52dcbef..866f273 100644 --- a/src/main/java/com/chorem/bow/model/AuthenticationInfo.java +++ b/src/main/java/com/chorem/bow/model/AuthenticationInfo.java @@ -6,9 +6,11 @@ import lombok.Data; public class AuthenticationInfo { String description; String login; + /** html pour créer la forme de login */ + String form; /** le nombre de composant du domain a prendre (default 2, ex: codelutin.com) */ - byte domainComponent; - byte maxLength; + short domainComponent = 2; + short maxLength = 15; String allowedChar; String disallowedChar; /** chaine ajouter en prefix du master password avant le hash */ diff --git a/src/main/java/com/chorem/bow/model/BowUser.java b/src/main/java/com/chorem/bow/model/BowUser.java index 3ca969a..ef1ac04 100644 --- a/src/main/java/com/chorem/bow/model/BowUser.java +++ b/src/main/java/com/chorem/bow/model/BowUser.java @@ -23,5 +23,7 @@ public class BowUser { AuthenticationInfo authenticationInfo; boolean autoScreenshot; boolean autoFavicon; + int maxTagInCloud = 25; + int maxResult = 50; HashSet<Action> actions; } diff --git a/src/main/java/com/chorem/bow/repositories/BookmarkRepository.java b/src/main/java/com/chorem/bow/repositories/BookmarkRepository.java index f159218..877bad8 100644 --- a/src/main/java/com/chorem/bow/repositories/BookmarkRepository.java +++ b/src/main/java/com/chorem/bow/repositories/BookmarkRepository.java @@ -2,9 +2,11 @@ package com.chorem.bow.repositories; import com.chorem.bow.model.AuthenticationInfo; import com.chorem.bow.model.Bookmark; +import com.chorem.bow.model.BowUser; import org.nuiton.spgeed.annotations.Select; import org.nuiton.spgeed.annotations.Update; +import java.util.Collection; import java.util.List; import java.util.UUID; @@ -17,19 +19,31 @@ public interface BookmarkRepository { Bookmark insert(Bookmark bookmark); @Update(sql = - "UPDATE INTO bookmark AS t" + + "UPDATE bookmark AS t" + " SET (owner, uri, description, privateAlias, publicAlias, authenticationInfo, lang) = " + " (SELECT * FROM json_populate_record(NULL::bookmark, ${bookmark |json()}::json))" + " RETURNING *") Bookmark update(Bookmark bookmark); - @Update(sql = "UPDATE INTO bookmark AS t" + + @Update(sql = "UPDATE bookmark AS t" + " SET authenticationInfo = (SELECT * FROM json_populate_record(NULL::AuthenticationInfo, ${info |json()}::json))" + " WHERE id=${id}" + " RETURNING *") Bookmark updateAuthenticationInfo(UUID id, AuthenticationInfo info); - @Update(sql = "UPDATE INTO bookmark AS t" + + @Update(sql = "UPDATE bookmark AS t" + + " SET privateAlias = ${alias |array()}" + + " WHERE id=${id}" + + " RETURNING *") + Bookmark updatePrivateAlias(UUID id, Collection alias); + + @Update(sql = "UPDATE bookmark AS t" + + " SET publicAlias = ${alias |array()}" + + " WHERE id=${id}" + + " RETURNING *") + Bookmark updatePublicAlias(UUID id, Collection alias); + + @Update(sql = "UPDATE bookmark AS t" + " SET visit = visit + 1" + " WHERE id=${idOrAlias}::uuid OR privateAlias @> ARRAY[${idOrAlias}] OR publicAlias @> ARRAY[${idOrAlias}]" + " RETURNING uri") diff --git a/src/main/java/com/chorem/bow/repositories/BowUserRepository.java b/src/main/java/com/chorem/bow/repositories/BowUserRepository.java index 4b63bc3..75db804 100644 --- a/src/main/java/com/chorem/bow/repositories/BowUserRepository.java +++ b/src/main/java/com/chorem/bow/repositories/BowUserRepository.java @@ -13,6 +13,24 @@ import java.util.UUID; public interface BowUserRepository { + @Update(sql = + "INSERT INTO bowUser AS t" + + " SELECT * FROM json_populate_record(NULL::bowUser, ${user |json()}::json)" + + " ON CONFLICT (id) DO UPDATE SET" + + " login = EXCLUDED.login," + + " password = EXCLUDED.password," + + " tokens = EXCLUDED.tokens," + + " emails = EXCLUDED.emails," + + " unconfirmedEmails = EXCLUDED.unconfirmedEmails," + + " authenticationInfo = EXCLUDED.authenticationInfo," + + " autoScreenshot = EXCLUDED.autoScreenshot," + + " autoFavicon = EXCLUDED.autoFavicon," + + " maxTagInCloud = EXCLUDED.maxTagInCloud," + + " maxResult = EXCLUDED.maxResult," + + " actions = EXCLUDED.actions" + + " RETURNING *") + BowUser upsert(BowUser user); + @Update(sql = "INSERT INTO bowUser AS t" + " SELECT * FROM json_populate_record(NULL::bowUser, ${user |json()}::json)" + @@ -20,43 +38,34 @@ public interface BowUserRepository { BowUser insert(BowUser user); @Update(sql = - "UPDATE INTO bowUser AS t" + - " SET (login, password, tokens, emails, unconfirmedEmails, authenticationInfo, autoScreenshot, autoFavicon, actions) = " + - " (SELECT * FROM json_populate_record(NULL::bowUser, ${user |json()}::json))" + + "UPDATE bowUser AS t" + + " SET (login, password, tokens, emails, unconfirmedEmails, authenticationInfo, autoScreenshot, autoFavicon, maxTagInCloud, maxResult, actions) = " + + " (SELECT login, password, tokens, emails, unconfirmedEmails, authenticationInfo, autoScreenshot, autoFavicon, maxTagInCloud, maxResult, actions FROM json_populate_record(NULL::bowUser, ${user |json()}::json))" + " RETURNING *") BowUser update(BowUser user); - @Update(sql = "UPDATE INTO bowUser AS t" + + @Update(sql = "UPDATE bowUser AS t" + " SET authenticationInfo = (SELECT * FROM json_populate_record(NULL::AuthenticationInfo, ${info |json()}::json))" + " WHERE id=${id}" + " RETURNING *") BowUser updateAuthenticationInfo(UUID id, AuthenticationInfo info); - @Update(sql = "UPDATE INTO bowUser AS t" + - " SET emails = ${info |array()}" + + @Update(sql = "UPDATE bowUser AS t" + + " SET emails = ${emails |array()}" + " WHERE id=${id}" + " RETURNING *") BowUser updateEmails(UUID id, Collection emails); - @Update(sql = "UPDATE INTO bowUser AS t" + - " SET privateAlias = ${alias |array()}" + - " WHERE id=${id}" + - " RETURNING *") - BowUser updatePrivateAlias(UUID id, Collection alias); - - @Update(sql = "UPDATE INTO bowUser AS t" + - " SET publicAlias = ${alias |array()}" + - " WHERE id=${id}" + - " RETURNING *") - BowUser updatePublicAlias(UUID id, Collection alias); - - @Select(sql = "select * from bowUser") + @Select(sql = "SELECT * FROM bowUser") List<BowUser> findAll(); - @Select(sql = "select * from bowUser where id=${uuid}::uuid") + @Select(sql = "SELECT * FROM bowUser WHERE id=${uuid}::uuid") BowUser find(UUID uuid); - @Select(sql = "select * from bowUser where login=${loginOrEmail} or email ? ${loginOrEmail}") + @Select(sql = "SELECT * FROM bowUser WHERE login=${loginOrEmail} or email ? ${loginOrEmail}") BowUser find(String loginOrEmail); + @Update(sql = "DELETE FROM bowUser WHERE id=${id} RETURNING *") + BowUser delete(UUID id); + } diff --git a/src/main/java/com/chorem/bow/rest/BowUserResources.java b/src/main/java/com/chorem/bow/rest/BowUserResources.java index c8ea1d7..c74aabd 100644 --- a/src/main/java/com/chorem/bow/rest/BowUserResources.java +++ b/src/main/java/com/chorem/bow/rest/BowUserResources.java @@ -3,6 +3,7 @@ package com.chorem.bow.rest; import com.chorem.bow.model.BowUser; import com.chorem.bow.repositories.BowUserRepository; import io.jooby.Jooby; +import io.jooby.StatusCode; import org.nuiton.spgeed.SqlSession; import java.util.Set; @@ -27,13 +28,17 @@ public class BowUserResources { //extends Jooby { UUID id = ctx.path("id").to(UUID.class); try (SqlSession session = app.require(SqlSession.class)) { BowUserRepository repo = session.getDao(BowUserRepository.class); - return repo.find(id); + BowUser bowUser = repo.find(id); + if (bowUser == null) { + ctx.setResponseCode(StatusCode.NOT_FOUND); + } + return bowUser; } }); app.post("/", ctx -> { BowUser user = ctx.body(BowUser.class); - app.getLog().info("insert user: " + user); + app.getLog().debug("insert user: " + user); try (SqlSession session = app.require(SqlSession.class)) { BowUserRepository repo = session.getDao(BowUserRepository.class); return repo.insert(user); @@ -41,7 +46,9 @@ public class BowUserResources { //extends Jooby { }); app.put("/{id}", ctx -> { + UUID id = ctx.path("id").to(UUID.class); BowUser user = ctx.body(BowUser.class); + user.setId(id); try (SqlSession session = app.require(SqlSession.class)) { BowUserRepository repo = session.getDao(BowUserRepository.class); return repo.update(user); @@ -57,6 +64,18 @@ public class BowUserResources { //extends Jooby { } }); + app.delete("/{id}", ctx -> { + UUID id = ctx.path("id").to(UUID.class); + try (SqlSession session = app.require(SqlSession.class)) { + BowUserRepository repo = session.getDao(BowUserRepository.class); + BowUser bowUser = repo.delete(id); + if (bowUser == null) { + ctx.setResponseCode(StatusCode.NOT_FOUND); + } + return bowUser; + } + }); + }); } } diff --git a/src/main/resources/db/migration/V1__init_schema.sql b/src/main/resources/db/migration/V1__init_schema.sql index ddf22f1..3b35ed1 100644 --- a/src/main/resources/db/migration/V1__init_schema.sql +++ b/src/main/resources/db/migration/V1__init_schema.sql @@ -15,6 +15,7 @@ CREATE OR REPLACE FUNCTION text(citext[]) create type AuthenticationInfo as ( description text, login text, + form text, domainComponent smallint, -- le nombre de composant du domain a prendre (default 2, ex: codelutin.com) maxLength smallint, allowedChar text, @@ -41,6 +42,8 @@ create table bowUser ( authenticationInfo AuthenticationInfo, autoScreenshot boolean, autoFavicon boolean, + maxTagInCloud smallint, + maxResult smallint, actions Action[] -- ,EXCLUDE USING gist (emails WITH &&, unconfirmedEmails WITH &&) ); diff --git a/src/main/templates/views/editUser.rocker.html b/src/main/templates/views/editUser.rocker.html new file mode 100644 index 0000000..76476fd --- /dev/null +++ b/src/main/templates/views/editUser.rocker.html @@ -0,0 +1,25 @@ +@import com.chorem.bow.model.BowUser + +@args (BowUser user) + +@views.main.template("Edit user", RockerContent.NONE, RockerContent.NONE) -> { +<form method="post"> + <input type="hidden" name="id" value="@?user.getId()"> + login: <input type="text" name="login" value="@?user.getLogin()"><br> + password: <input type="password" name="password" value="@?user.getPassword()"><br> + autoScreenshot: <input type="checkbox" name="autoScreenshot" @(user != null && user.isAutoScreenshot() ? "CHECKED" : "")><br> + autoFavicon: <input type="checkbox" name="autoFavicon" @(user != null && user.isAutoFavicon() ? "CHECKED" : "")><br> + maxTagInCloud: <input type="number" name="maxTagInCloud" value="@?user.getMaxTagInCloud()"><br> + maxResult: <input type="number" name="maxResult" value="@?user.getMaxResult()"><br> + + <!-- + Map<String, String> tokens; + LinkedHashSet<String> emails; + /* en cle l'email, en valeur une chaine random (uuid) qui permet la validation */ + Map<String, String> unconfirmedEmails; + AuthenticationInfo authenticationInfo; + HashSet<Action> actions; +--> + <input type="submit" name="Save"> +</form> +} \ No newline at end of file diff --git a/src/main/templates/views/index.rocker.html b/src/main/templates/views/index.rocker.html index 279db61..0c4ebcc 100644 --- a/src/main/templates/views/index.rocker.html +++ b/src/main/templates/views/index.rocker.html @@ -1,3 +1,5 @@ @args (String message) <p>Hello @message!</p> +<a href="/editUser">New User</a> +<a href="/listUsers">List Users</a> \ No newline at end of file diff --git a/src/main/templates/views/listUsers.rocker.html b/src/main/templates/views/listUsers.rocker.html new file mode 100644 index 0000000..18497b5 --- /dev/null +++ b/src/main/templates/views/listUsers.rocker.html @@ -0,0 +1,10 @@ +@import com.chorem.bow.model.BowUser +@import java.util.Collection; + +@args (Collection<BowUser> users) + +@views.main.template("List users", RockerContent.NONE, RockerContent.NONE) -> { + @for (user : users) { + <li><a href="/editUser?id=@user.getId()">@?user.getLogin()</a></li> + } +} \ No newline at end of file diff --git a/src/main/templates/views/main.rocker.html b/src/main/templates/views/main.rocker.html new file mode 100644 index 0000000..bbb75d0 --- /dev/null +++ b/src/main/templates/views/main.rocker.html @@ -0,0 +1,12 @@ +@args (String title, RockerContent extracss, RockerContent extrajs, RockerBody content) + +<html> +<head> + <title>@title</title> + @extracss +<body> +<div><a href="/">Home</a></div> +@content +@extrajs +</body> +</html> \ No newline at end of file diff --git a/src/test/java/com/chorem/bow/BowAppTest.java b/src/test/java/com/chorem/bow/BowAppTest.java index c2954e6..be605f3 100644 --- a/src/test/java/com/chorem/bow/BowAppTest.java +++ b/src/test/java/com/chorem/bow/BowAppTest.java @@ -2,18 +2,17 @@ package com.chorem.bow; import io.jooby.MockRouter; import io.jooby.StatusCode; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; public class BowAppTest { - +// // @Test -// public void unitTest() throws Throwable { +// public void testHome() throws Throwable { // MockRouter router = new MockRouter(new BowApp()); // router.get("/", response -> { -// assertEquals(StatusCode.OK, response.getStatusCode()); -// assertEquals("Hello World!", response.value(String.class)); +// Assertions.assertEquals(StatusCode.OK, response.getStatusCode()); +// Assertions.assertEquals("Hello World!", response.value(String.class)); // }); // } diff --git a/src/test/java/com/chorem/bow/rest/BowUserResourcesTest.java b/src/test/java/com/chorem/bow/rest/BowUserResourcesTest.java index f3064ca..43ed7a9 100644 --- a/src/test/java/com/chorem/bow/rest/BowUserResourcesTest.java +++ b/src/test/java/com/chorem/bow/rest/BowUserResourcesTest.java @@ -1,14 +1,12 @@ package com.chorem.bow.rest; import com.chorem.bow.BowApp; +import com.chorem.bow.model.AuthenticationInfo; import com.chorem.bow.model.BowUser; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import io.jooby.JoobyTest; -import io.jooby.MockContext; -import io.jooby.MockRouter; import io.jooby.StatusCode; import io.jooby.json.JacksonModule; import okhttp3.MediaType; @@ -16,18 +14,16 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; -import org.junit.Test; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.LinkedHashSet; -import static org.junit.Assert.assertEquals; - @JoobyTest(BowApp.class) public class BowUserResourcesTest { public String serverPath; - public int serverPort; OkHttpClient client = new OkHttpClient(); ObjectMapper jsonMapper = JacksonModule.create() @@ -41,28 +37,73 @@ public class BowUserResourcesTest { user.setPassword("xxxxxxxx"); user.setEmails(new LinkedHashSet<>(Arrays.asList("bpoussin.free.fr", "poussin@codelutin.com"))); -// String contentType = Content-Type", MediaType.json.toString()); - - System.out.println(serverPath); - System.out.println(serverPort); - + System.out.println("Creation user"); + // CREATION String userAsJson = jsonMapper.writeValueAsString(user); - System.out.println(userAsJson); - RequestBody body = RequestBody.create(userAsJson, MediaType.get("application/json")); Request request = new Request.Builder() - .url(serverPath) + .url(serverPath + "users") .post(body) .build(); + + try (Response response = client.newCall(request).execute()) { + Assertions.assertEquals(StatusCode.OK.value(), response.code()); + user = jsonMapper.readValue(response.body().string(), BowUser.class); + } + + System.out.println("Update user"); + // UPDATE + AuthenticationInfo authenticationInfo = new AuthenticationInfo(); + authenticationInfo.setLogin("bpoussin"); + user.setAuthenticationInfo(authenticationInfo); + userAsJson = jsonMapper.writeValueAsString(user); + body = RequestBody.create(userAsJson, MediaType.get("application/json")); + request = new Request.Builder() + .url(serverPath + "users/" + user.getId()) + .put(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + Assertions.assertEquals(StatusCode.OK.value(), response.code()); + user = jsonMapper.readValue(response.body().string(), BowUser.class); + } + + System.out.println("Update user email"); + // UPDATE EMAIL + userAsJson = jsonMapper.writeValueAsString(Arrays.asList("poussin@toto.com")); + body = RequestBody.create(userAsJson, MediaType.get("application/json")); + request = new Request.Builder() + .url(serverPath + "users/" + user.getId() + "/emails") + .put(body) + .build(); + + try (Response response = client.newCall(request).execute()) { + Assertions.assertEquals(StatusCode.OK.value(), response.code()); + user = jsonMapper.readValue(response.body().string(), BowUser.class); + } + + System.out.println("Delete user"); + // DELETE + request = new Request.Builder() + .url(serverPath + "users/" + user.getId()) + .delete() + .build(); + try (Response response = client.newCall(request).execute()) { - System.out.println(response.body().string()); - assertEquals(StatusCode.OK, response.code()); + Assertions.assertEquals(StatusCode.OK.value(), response.code()); + user = jsonMapper.readValue(response.body().string(), BowUser.class); } - // router.post("/users", ctx, response -> { -// System.out.println(response.value()); -// assertEquals(StatusCode.OK, response.getStatusCode()); -// }); + System.out.println("Get user"); + // GET + request = new Request.Builder() + .url(serverPath + "users/" + user.getId()) + .get() + .build(); + + try (Response response = client.newCall(request).execute()) { + Assertions.assertEquals(StatusCode.NOT_FOUND.value(), response.code()); + } } -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.