Commit 1a3690532323c1c3d0a983a4cbd539ca62119322

Authored by Thomas Ziemer
2 parents 27791b11 8cae1cc5

Merge into master

src/main/java/net/ziemers/swxercise/lg/user/dto/UserDto.java
1 package net.ziemers.swxercise.lg.user.dto; 1 package net.ziemers.swxercise.lg.user.dto;
2 2
  3 +import net.ziemers.swxercise.lg.model.user.User;
  4 +
3 import javax.validation.constraints.NotNull; 5 import javax.validation.constraints.NotNull;
4 6
5 /** 7 /**
@@ -8,7 +10,7 @@ import javax.validation.constraints.NotNull; @@ -8,7 +10,7 @@ import javax.validation.constraints.NotNull;
8 */ 10 */
9 public class UserDto { 11 public class UserDto {
10 12
11 - private Long entityId; 13 + private User user = null;
12 14
13 @NotNull 15 @NotNull
14 private String username; // aus dem Profile 16 private String username; // aus dem Profile
@@ -22,12 +24,12 @@ public class UserDto { @@ -22,12 +24,12 @@ public class UserDto {
22 24
23 private String mailaddress; // aus dem Profile 25 private String mailaddress; // aus dem Profile
24 26
25 - public Long getEntityId() {  
26 - return entityId; 27 + public User getUser() {
  28 + return user;
27 } 29 }
28 30
29 - public void setEntityId(Long entityId) {  
30 - this.entityId = entityId; 31 + public void setUser(User user) {
  32 + this.user = user;
31 } 33 }
32 34
33 public String getUsername() { 35 public String getUsername() {
src/main/java/net/ziemers/swxercise/lg/user/service/EntityToUserDtoMapper.java
@@ -9,7 +9,7 @@ import net.ziemers.swxercise.lg.user.dto.UserDto; @@ -9,7 +9,7 @@ import net.ziemers.swxercise.lg.user.dto.UserDto;
9 public class EntityToUserDtoMapper { 9 public class EntityToUserDtoMapper {
10 10
11 /** 11 /**
12 - * Erzeugt ein DTO aus dem übergebenem Kontext. 12 + * Erzeugt ein Data Transfer Object aus dem übergebenem Kontext.
13 * 13 *
14 * @param ctx der Kontext 14 * @param ctx der Kontext
15 * @return das erzeugte DTO. 15 * @return das erzeugte DTO.
@@ -18,15 +18,15 @@ public class EntityToUserDtoMapper { @@ -18,15 +18,15 @@ public class EntityToUserDtoMapper {
18 final UserDto dto = new UserDto(); 18 final UserDto dto = new UserDto();
19 19
20 if (ctx.user != null) { 20 if (ctx.user != null) {
21 - mapEntityId(ctx, dto); 21 + mapUser(ctx, dto);
22 mapFirstname(ctx, dto); 22 mapFirstname(ctx, dto);
23 mapLastname(ctx, dto); 23 mapLastname(ctx, dto);
24 } 24 }
25 return dto; 25 return dto;
26 } 26 }
27 27
28 - private void mapEntityId(EntityToUserDtoContext ctx, UserDto dto) {  
29 - dto.setEntityId(ctx.user.getId()); 28 + private void mapUser(EntityToUserDtoContext ctx, UserDto dto) {
  29 + dto.setUser(ctx.user);
30 } 30 }
31 31
32 private void mapFirstname(EntityToUserDtoContext ctx, UserDto dto) { 32 private void mapFirstname(EntityToUserDtoContext ctx, UserDto dto) {
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContext.java
@@ -13,6 +13,6 @@ public class UserDtoToEntityContext { @@ -13,6 +13,6 @@ public class UserDtoToEntityContext {
13 13
14 public Profile profile; 14 public Profile profile;
15 15
16 - public Address address; 16 + public Address address = null;
17 17
18 } 18 }
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityContextService.java
@@ -22,20 +22,27 @@ public class UserDtoToEntityContextService { @@ -22,20 +22,27 @@ public class UserDtoToEntityContextService {
22 */ 22 */
23 public UserDtoToEntityContext createContext(final UserDto dto) { 23 public UserDtoToEntityContext createContext(final UserDto dto) {
24 final UserDtoToEntityContext ctx = new UserDtoToEntityContext(); 24 final UserDtoToEntityContext ctx = new UserDtoToEntityContext();
  25 + final User existingUser = dto.getUser();
25 26
26 // das übergebene UserDto in den Kontext füllen 27 // das übergebene UserDto in den Kontext füllen
27 ctx.dto = dto; 28 ctx.dto = dto;
28 29
29 - // einen neuen oder einen bereits existierenden Benutzer in den Kontext füllen  
30 - ctx.user = dao.findByUsername(dto.getUsername());  
31 - if (ctx.user == null) {  
32 - // es soll niemals ein Profil ohne Benutzername und Kennwort geben  
33 - ctx.profile = new Profile(dto.getUsername(), dto.getPassword()); 30 + // einen neuen Benutzer in den Kontext füllen
  31 + if (existingUser == null) {
  32 + // es darf nicht mehrere Benutzer mit dem selben Benutzernamen geben!
  33 + if (dao.findByUsername(dto.getUsername()) == null) {
  34 + // es soll niemals ein Profil ohne Benutzername und Kennwort geben
  35 + ctx.profile = new Profile(dto.getUsername(), dto.getPassword());
  36 +
  37 + // wir füllen das User-Objekt mit Method Chaining
  38 + ctx.user = new User(dto.getFirstname(), dto.getLastname())
  39 + .withProfile(ctx.profile);
  40 + }
  41 + }
34 42
35 - // wir füllen das User-Objekt mit Method Chaining  
36 - ctx.user = new User(dto.getFirstname(), dto.getLastname())  
37 - .withProfile(ctx.profile);  
38 - } else { 43 + // einen bereits existierenden Benutzer in den Kontext füllen
  44 + else {
  45 + ctx.user = existingUser;
39 ctx.profile = ctx.user.getProfile(); 46 ctx.profile = ctx.user.getProfile();
40 ctx.address = ctx.user.getAddress(); 47 ctx.address = ctx.user.getAddress();
41 } 48 }
src/main/java/net/ziemers/swxercise/lg/user/service/UserDtoToEntityMapper.java
@@ -11,26 +11,30 @@ import javax.ejb.Stateless; @@ -11,26 +11,30 @@ import javax.ejb.Stateless;
11 public class UserDtoToEntityMapper { 11 public class UserDtoToEntityMapper {
12 12
13 /** 13 /**
14 - * Überträgt die Eigenschaften aus dem UserDto sowie dem zusätzlichen Kontext in die Zielentität. 14 + * Überträgt die Eigenschaften aus dem UserDto sowie dem zusätzlichen Kontext in die Zielentitäten.
  15 + * Anzumerken ist, dass der Benutzername einer existierenden Profile-Entität niemals aktualisiert
  16 + * wird.
15 * 17 *
16 * @param ctx der Kontext mit den Eigenschaften und der Zielentität 18 * @param ctx der Kontext mit den Eigenschaften und der Zielentität
17 * @return den Kontext. 19 * @return den Kontext.
18 */ 20 */
19 public UserDtoToEntityContext map(UserDtoToEntityContext ctx) { 21 public UserDtoToEntityContext map(UserDtoToEntityContext ctx) {
20 - // User-Objekt mappen 22 + // ins User-Objekt mappen
21 ctx.user.setFirstname(ctx.dto.getFirstname()); 23 ctx.user.setFirstname(ctx.dto.getFirstname());
22 ctx.user.setLastname(ctx.dto.getLastname()); 24 ctx.user.setLastname(ctx.dto.getLastname());
23 25
24 - // Profile-Objekt mappen, falls gegeben 26 + // ins Profile-Objekt mappen, falls gegeben
25 if (ctx.profile != null) { 27 if (ctx.profile != null) {
26 ctx.user.setProfile(ctx.profile); 28 ctx.user.setProfile(ctx.profile);
  29 +
  30 + // eventuell ein neues Kenntwort ins Profile-Objekt mappen
27 if(ctx.dto.getPassword().length() > 0) { 31 if(ctx.dto.getPassword().length() > 0) {
28 ctx.profile.setPassword(ctx.dto.getPassword()); 32 ctx.profile.setPassword(ctx.dto.getPassword());
29 } 33 }
30 ctx.profile.setMailaddress(ctx.dto.getMailaddress()); 34 ctx.profile.setMailaddress(ctx.dto.getMailaddress());
31 } 35 }
32 36
33 - // Address-Objekt mappen, falls gegeben 37 + // ins Address-Objekt mappen, falls gegeben
34 if (ctx.address != null) { 38 if (ctx.address != null) {
35 ctx.user.setAddress(ctx.address); 39 ctx.user.setAddress(ctx.address);
36 } 40 }
src/main/java/net/ziemers/swxercise/lg/user/service/UserService.java
@@ -81,20 +81,17 @@ public class UserService { @@ -81,20 +81,17 @@ public class UserService {
81 * Zwischen der Groß- und Kleinschreibung wird nicht unterschieden. 81 * Zwischen der Groß- und Kleinschreibung wird nicht unterschieden.
82 * 82 *
83 * @param dto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers 83 * @param dto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers
84 - * @return die Id des neuen Benutzers, wenn die Erstellung erfolgreich war. 84 + * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war.
85 */ 85 */
86 - public Long createUser(final UserDto dto) { 86 + public boolean createUser(final UserDto dto) {
  87 + // Kontext für den zu erstellenden Benutzer erzeugen; falls bereits ein Benutzer
  88 + // mit dem selben Benutzernamen existiert, wird kein Benutzerobjekt zurückgeliefert
87 final UserDtoToEntityContext ctx = ctxService.createContext(dto); 89 final UserDtoToEntityContext ctx = ctxService.createContext(dto);
88 - mapper.map(ctx);  
89 - return persistUserIfNew(ctx);  
90 - }  
91 -  
92 - private Long persistUserIfNew(final UserDtoToEntityContext ctx) {  
93 - // nur ein neuer Benutzer hat noch keine Id  
94 - if (ctx.user.getId() == null) {  
95 - return dao.save(ctx.user); 90 + if (ctx.user != null) {
  91 + mapper.map(ctx);
  92 + return dao.save(ctx.user) != null;
96 } 93 }
97 - return null; 94 + return false;
98 } 95 }
99 96
100 /** 97 /**
@@ -107,8 +104,12 @@ public class UserService { @@ -107,8 +104,12 @@ public class UserService {
107 public boolean updateUser(final Long id, final UserDto dto) { 104 public boolean updateUser(final Long id, final UserDto dto) {
108 final User user = dao.findById(id); 105 final User user = dao.findById(id);
109 if (user != null) { 106 if (user != null) {
110 - // TODO noch zu implementieren  
111 - return false; 107 + // auf dieses Benutzerobjekt soll sich die Aktualisierung beziehen
  108 + dto.setUser(user);
  109 +
  110 + final UserDtoToEntityContext ctx = ctxService.createContext(dto);
  111 + mapper.map(ctx);
  112 + return dao.saveOrUpdate(ctx.user) != null;
112 } 113 }
113 return false; 114 return false;
114 } 115 }
@@ -120,16 +121,8 @@ public class UserService { @@ -120,16 +121,8 @@ public class UserService {
120 * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. 121 * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war.
121 */ 122 */
122 public boolean updateUser(final UserDto dto) { 123 public boolean updateUser(final UserDto dto) {
123 - // ist zurzeit ein Benutzer angemeldet, können wir ihn aktualisieren  
124 final User user = sessionContext.getUser(); 124 final User user = sessionContext.getUser();
125 - if (user != null) {  
126 - // der Benutzername darf sich beim Aktualisieren nicht mehr ändern!  
127 - dto.withUsername(user.getProfile().getUsername());  
128 - final UserDtoToEntityContext ctx = ctxService.createContext(dto);  
129 - mapper.map(ctx);  
130 - return dao.saveOrUpdate(ctx.user) != null;  
131 - }  
132 - return false; 125 + return updateUser(user.getId(), dto);
133 } 126 }
134 127
135 /** 128 /**
src/main/java/net/ziemers/swxercise/ui/UserViewController.java
@@ -89,9 +89,8 @@ public class UserViewController { @@ -89,9 +89,8 @@ public class UserViewController {
89 @Produces(MediaType.APPLICATION_JSON) 89 @Produces(MediaType.APPLICATION_JSON)
90 @RolesAllowed(RightState.Constants.ADMIN) 90 @RolesAllowed(RightState.Constants.ADMIN)
91 public RestResponse createUser(UserDto dto) { 91 public RestResponse createUser(UserDto dto) {
92 - final Long id = userService.createUser(dto);  
93 - if (id != null) {  
94 - return new RestResponse(ResponseState.SUCCESS, String.valueOf(id)); 92 + if (userService.createUser(dto)) {
  93 + return new RestResponse();
95 } 94 }
96 return new RestResponse(ResponseState.ALREADY_EXISTING); 95 return new RestResponse(ResponseState.ALREADY_EXISTING);
97 } 96 }
src/test/java/net/ziemers/swxercise/lg/user/service/UserServiceTest.java
@@ -29,12 +29,13 @@ public class UserServiceTest extends JpaTestUtils { @@ -29,12 +29,13 @@ public class UserServiceTest extends JpaTestUtils {
29 29
30 private static String USERNAME_TEST = "username_test"; 30 private static String USERNAME_TEST = "username_test";
31 private static String EXISTING_USERNAME_TEST = "username_profile"; 31 private static String EXISTING_USERNAME_TEST = "username_profile";
  32 + private static Long EXISTING_USER_ID = 2L;
32 33
33 private static boolean dbInitialized; 34 private static boolean dbInitialized;
34 35
35 private UserDto userDto; 36 private UserDto userDto;
36 37
37 - private Long userId; 38 + private boolean actual;
38 39
39 @Inject 40 @Inject
40 private UserDao userDao; 41 private UserDao userDao;
@@ -74,7 +75,20 @@ public class UserServiceTest extends JpaTestUtils { @@ -74,7 +75,20 @@ public class UserServiceTest extends JpaTestUtils {
74 .createUser(); 75 .createUser();
75 76
76 then() 77 then()
77 - .assertCreateFail(); 78 + .assertCreateFailure();
  79 + }
  80 +
  81 + @Test
  82 + public void testUpdateUserDoesntUpdateUsername() {
  83 +
  84 + given()
  85 + .userDto(USERNAME_TEST);
  86 +
  87 + when()
  88 + .updateUser(EXISTING_USER_ID);
  89 +
  90 + then()
  91 + .assertUpdateSuccess();
78 } 92 }
79 93
80 // given 94 // given
@@ -85,7 +99,7 @@ public class UserServiceTest extends JpaTestUtils { @@ -85,7 +99,7 @@ public class UserServiceTest extends JpaTestUtils {
85 99
86 private UserServiceTest userDto(final String username) { 100 private UserServiceTest userDto(final String username) {
87 userDto = new UserDtoTestDataBuilder() 101 userDto = new UserDtoTestDataBuilder()
88 - .withUsername(USERNAME_TEST) 102 + .withUsername(username)
89 .build(); 103 .build();
90 return this; 104 return this;
91 } 105 }
@@ -98,7 +112,15 @@ public class UserServiceTest extends JpaTestUtils { @@ -98,7 +112,15 @@ public class UserServiceTest extends JpaTestUtils {
98 112
99 private UserServiceTest createUser() { 113 private UserServiceTest createUser() {
100 txBegin(); 114 txBegin();
101 - userId = underTest.createUser(userDto); 115 + actual = underTest.createUser(userDto);
  116 + txCommit();
  117 +
  118 + return this;
  119 + }
  120 +
  121 + private UserServiceTest updateUser(final Long id) {
  122 + txBegin();
  123 + actual = underTest.updateUser(id, userDto);
102 txCommit(); 124 txCommit();
103 125
104 return this; 126 return this;
@@ -111,14 +133,20 @@ public class UserServiceTest extends JpaTestUtils { @@ -111,14 +133,20 @@ public class UserServiceTest extends JpaTestUtils {
111 } 133 }
112 134
113 private void assertCreateSuccess() { 135 private void assertCreateSuccess() {
114 - // wir suchen den soeben erstellten Benutzer; wenn er existiert, is alles gut 136 + // wir suchen den soeben erstellten Benutzer; wenn er existiert, ist alles gut
115 final User user = userDao.findByUsername(USERNAME_TEST); 137 final User user = userDao.findByUsername(USERNAME_TEST);
116 assertNotNull(user); 138 assertNotNull(user);
117 } 139 }
118 140
119 - private void assertCreateFail() {  
120 - // es darf kein neuer Benutzer mit identischem "username" erstellt worden sein  
121 - assertNull(userId); 141 + private void assertCreateFailure() {
  142 + // es darf kein neuer Benutzer mit identischem Benutzernamen erstellt worden sein
  143 + assertFalse(actual);
  144 + }
  145 +
  146 + private void assertUpdateSuccess() {
  147 + // wir suchen den soeben aktualisierten Benutzer; wenn sein Benutzername unverändert ist, ist alles gut
  148 + final User user = userDao.findById(EXISTING_USER_ID);
  149 + assertEquals(EXISTING_USERNAME_TEST, user.getProfile().getUsername());
122 } 150 }
123 151
124 } 152 }
src/test/java/net/ziemers/swxercise/ui/UserViewControllerTest.java
1 package net.ziemers.swxercise.ui; 1 package net.ziemers.swxercise.ui;
2 2
3 -import net.ziemers.swxercise.lg.model.user.User;  
4 import net.ziemers.swxercise.lg.testdatabuilder.user.UserDtoTestDataBuilder; 3 import net.ziemers.swxercise.lg.testdatabuilder.user.UserDtoTestDataBuilder;
5 -import net.ziemers.swxercise.lg.testdatabuilder.user.UserTestDataBuilder;  
6 import net.ziemers.swxercise.lg.user.dto.UserDto; 4 import net.ziemers.swxercise.lg.user.dto.UserDto;
7 import net.ziemers.swxercise.lg.user.service.UserService; 5 import net.ziemers.swxercise.lg.user.service.UserService;
  6 +import net.ziemers.swxercise.ui.enums.ResponseState;
8 import org.junit.Test; 7 import org.junit.Test;
9 import org.junit.runner.RunWith; 8 import org.junit.runner.RunWith;
10 import org.mockito.InjectMocks; 9 import org.mockito.InjectMocks;
@@ -33,8 +32,6 @@ public class UserViewControllerTest { @@ -33,8 +32,6 @@ public class UserViewControllerTest {
33 32
34 private UserDto userDto; 33 private UserDto userDto;
35 34
36 - private User user;  
37 -  
38 private RestResponse actual; 35 private RestResponse actual;
39 36
40 @Test 37 @Test
@@ -59,12 +56,54 @@ public class UserViewControllerTest { @@ -59,12 +56,54 @@ public class UserViewControllerTest {
59 56
60 @Test 57 @Test
61 public void testCreateUserReturnsSuccess() { 58 public void testCreateUserReturnsSuccess() {
62 - // TODO Test ist noch zu implementieren 59 +
  60 + given()
  61 + .userDto();
  62 +
  63 + doing()
  64 + .createUser(true);
  65 +
  66 + then()
  67 + .assertCreateSuccess();
63 } 68 }
64 69
65 @Test 70 @Test
66 - public void testUpdateUserReturnsSuccess() {  
67 - // TODO Test ist noch zu implementieren 71 + public void testCreateUserReturnsFailure() {
  72 +
  73 + given()
  74 + .userDto();
  75 +
  76 + doing()
  77 + .createUser(false);
  78 +
  79 + then()
  80 + .assertCreateFailure();
  81 + }
  82 +
  83 + @Test
  84 + public void testUpdateLoggedInUserReturnsSuccess() {
  85 +
  86 + given()
  87 + .userDto();
  88 +
  89 + doing()
  90 + .updateUser();
  91 +
  92 + then()
  93 + .assertUpdateSuccess();
  94 + }
  95 +
  96 + @Test
  97 + public void testUpdateSpecificUserReturnsSuccess() {
  98 +
  99 + given()
  100 + .userDto();
  101 +
  102 + doing()
  103 + .updateUser(1L);
  104 +
  105 + then()
  106 + .assertUpdateSuccess();
68 } 107 }
69 108
70 @Test 109 @Test
@@ -81,17 +120,29 @@ public class UserViewControllerTest { @@ -81,17 +120,29 @@ public class UserViewControllerTest {
81 public void testLoginUserReturnsSuccess() { 120 public void testLoginUserReturnsSuccess() {
82 121
83 given() 122 given()
84 - .userDto()  
85 - .user(); 123 + .userDto();
86 124
87 doing() 125 doing()
88 - .loginUser(); 126 + .loginUser(true);
89 127
90 then() 128 then()
91 .assertLoginSuccess(); 129 .assertLoginSuccess();
92 } 130 }
93 131
94 @Test 132 @Test
  133 + public void testLoginNonExistingUserReturnsFailure() {
  134 +
  135 + given()
  136 + .userDto();
  137 +
  138 + doing()
  139 + .loginUser(false);
  140 +
  141 + then()
  142 + .assertLoginFailure();
  143 + }
  144 +
  145 + @Test
95 public void testLogoutUserReturnsSuccess() { 146 public void testLogoutUserReturnsSuccess() {
96 147
97 doing() 148 doing()
@@ -112,23 +163,36 @@ public class UserViewControllerTest { @@ -112,23 +163,36 @@ public class UserViewControllerTest {
112 return this; 163 return this;
113 } 164 }
114 165
115 - private UserViewControllerTest user() {  
116 - user = new UserTestDataBuilder().build();  
117 - return this;  
118 - }  
119 -  
120 // doing 166 // doing
121 167
122 private UserViewControllerTest doing() { 168 private UserViewControllerTest doing() {
123 return this; 169 return this;
124 } 170 }
125 171
126 - private void loginUser() { 172 + private void createUser(final boolean result) {
127 /* 173 /*
128 * The when().thenReturn() method chain is used to specify 174 * The when().thenReturn() method chain is used to specify
129 * a return value for a method call with pre-defined parameters. 175 * a return value for a method call with pre-defined parameters.
130 */ 176 */
131 - when(userService.loginUser(userDto)).thenReturn(true); 177 + when(userService.createUser(userDto)).thenReturn(result);
  178 +
  179 + actual = underTest.createUser(userDto);
  180 + }
  181 +
  182 + private void updateUser() {
  183 + when(userService.updateUser(userDto)).thenReturn(true);
  184 +
  185 + actual = underTest.updateUser(userDto);
  186 + }
  187 +
  188 + private void updateUser(final Long id) {
  189 + when(userService.updateUser(id, userDto)).thenReturn(true);
  190 +
  191 + actual = underTest.updateUser(id, userDto);
  192 + }
  193 +
  194 + private void loginUser(final boolean result) {
  195 + when(userService.loginUser(userDto)).thenReturn(result);
132 196
133 actual = underTest.loginUser(userDto); 197 actual = underTest.loginUser(userDto);
134 } 198 }
@@ -145,11 +209,31 @@ public class UserViewControllerTest { @@ -145,11 +209,31 @@ public class UserViewControllerTest {
145 return this; 209 return this;
146 } 210 }
147 211
  212 + private void assertCreateSuccess() {
  213 + final RestResponse expected = new RestResponse();
  214 + assertEquals(expected, actual);
  215 + }
  216 +
  217 + private void assertCreateFailure() {
  218 + final RestResponse expected = new RestResponse(ResponseState.ALREADY_EXISTING);
  219 + assertEquals(expected, actual);
  220 + }
  221 +
  222 + private void assertUpdateSuccess() {
  223 + final RestResponse expected = new RestResponse();
  224 + assertEquals(expected, actual);
  225 + }
  226 +
148 private void assertLoginSuccess() { 227 private void assertLoginSuccess() {
149 final RestResponse expected = new RestResponse(); 228 final RestResponse expected = new RestResponse();
150 assertEquals(expected, actual); 229 assertEquals(expected, actual);
151 } 230 }
152 231
  232 + private void assertLoginFailure() {
  233 + final RestResponse expected = new RestResponse(ResponseState.FAILED);
  234 + assertEquals(expected, actual);
  235 + }
  236 +
153 private void assertLogoutSuccess() { 237 private void assertLogoutSuccess() {
154 final RestResponse expected = new RestResponse(); 238 final RestResponse expected = new RestResponse();
155 assertEquals(expected, actual); 239 assertEquals(expected, actual);
src/test/resources/net/ziemers/swxercise/testdata/UserServiceTestData.xml
1 <?xml version="1.0" encoding="UTF-8"?> 1 <?xml version="1.0" encoding="UTF-8"?>
2 <dataset> 2 <dataset>
3 <!-- die Grosz-/Kleinschreibung scheint unter bestimmten Bedingungen von Bedeutung zu sein! --> 3 <!-- die Grosz-/Kleinschreibung scheint unter bestimmten Bedingungen von Bedeutung zu sein! -->
4 - <Profile id="1" username="username_profile" passwordHash="passwordHash_profile" hashAlgorithm="hashAlgorithm_profile" salt="salt_profile"/> 4 + <Profile id="1" username="username_profile" passwordHash="passwordHash_profile" hashAlgorithm="SHA512" salt="salt_profile"/>
5 <User id="2" firstname="firstname_user" lastname="lastname_user" profile_id="1"/> 5 <User id="2" firstname="firstname_user" lastname="lastname_user" profile_id="1"/>
6 </dataset> 6 </dataset>