branch bow-v2 updated (82dfa54 -> 8d2105b)
This is an automated email from the git hooks/post-receive script. New change to branch bow-v2 in repository bow. See https://gitlab.nuiton.org/chorem/bow.git from 82dfa54 reecriture total en jooby/spgeed/rocker new 9e4eb96 test unitaire pour BowUser: ok ajout interface web pour bowUser (list, edit, create) new 8d2105b ajout du README.md The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 8d2105b5260365e6a8202391438a8b80a567e16a Author: Benjamin <poussin@codelutin.com> Date: Wed Jul 24 01:50:31 2019 +0200 ajout du README.md 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) Summary of changes: README.md | 4 ++ 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 ++++++++++++++++------ 16 files changed, 282 insertions(+), 56 deletions(-) create mode 100644 README.md delete mode 100644 log/bookmarks.log create mode 100644 src/main/templates/views/editUser.rocker.html create mode 100644 src/main/templates/views/listUsers.rocker.html create mode 100644 src/main/templates/views/main.rocker.html -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
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>.
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 8d2105b5260365e6a8202391438a8b80a567e16a Author: Benjamin <poussin@codelutin.com> Date: Wed Jul 24 01:50:31 2019 +0200 ajout du README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md new file mode 100644 index 0000000..09fd628 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +pour lancer le serveur: + + mvn jooby:run + -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm