Commit 2339acad authored by Alex Segers's avatar Alex Segers

Merge branch 'feature/manager_model' into 'dev'

Manager model, validations, and seeder

See merge request !6
parents e7b8d407 5ceb875a
Pipeline #1665 failed with stage
......@@ -31,7 +31,6 @@
<artifactId>spring-kafka</artifactId>
<version>2.7.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka-dist -->
<dependency>
<groupId>org.springframework.kafka</groupId>
......@@ -56,6 +55,32 @@
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.javafaker/javafaker -->
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>1.0.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.4.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.testng/testng -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
......@@ -73,7 +98,6 @@
<version>1.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
......@@ -82,5 +106,4 @@
</plugin>
</plugins>
</build>
</project>
package com.afp.ordermanagement.model;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.URL;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import javax.validation.constraints.*;
import java.lang.reflect.Field;
import static java.util.Objects.isNull;
@Data
@NoArgsConstructor
@Document(collection = "managers")
public class Manager {
@Id
private String id;
private String managerId;
private String email;
private String firstName;
private String lastName;
private String passwordDigest;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getManagerId() {
return managerId;
}
public void setManagerId(String managerId) {
this.managerId = managerId;
}
public String getEmail() {
return email;
}
@Size(min = 1, max = 250, message = "'firstName' must be between 1 & 250 characters")
@NotNull
private String firstName, lastName;
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
@Email
private String email;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
@NotNull
@Size(min = 21, max = 21, message = "'googleId' is invalid")
private String googleId;
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@URL(message = "'imageUrl' must be a valid URL")
private String imageUrl;
public String getPasswordDigest() {
return passwordDigest;
static public Manager combine(Manager target, Manager source) {
try {
for (Field field: Manager.class.getDeclaredFields()) {
String fieldName = field.getName();
Object sourceValue = field.get(source);
if (!isNull(sourceValue) && !fieldName.equals("id"))
field.set(target, sourceValue);
}
} catch (Exception ignore) { }
public void setPasswordDigest(String passwordDigest) {
this.passwordDigest = passwordDigest;
return target;
}
}
package com.afp.ordermanagement.model;
package com.afp.ordermanagement.UNIT_TESTS.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
......
package com.afp.ordermanagement.seeder;
import com.afp.ordermanagement.model.Manager;
import com.afp.ordermanagement.repository.ManagerRepository;
import com.github.javafaker.Faker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.stream.IntStream;
@Component
public class ManagerSeeder {
@Autowired
ManagerRepository managerRepository;
static private final Faker FAKER = new Faker();
static private final int SEED_COUNT = 1;
@EventListener
public void seedManager(ContextRefreshedEvent event) {
managerRepository
.deleteAll()
.subscribe();
IntStream.range(0, SEED_COUNT).forEach(n -> {
managerRepository
.insert(generateManager())
.subscribe();
});
}
private Manager generateManager(){
Manager manager = new Manager();
manager.setFirstName(FAKER.name().firstName());
manager.setLastName(FAKER.name().lastName());
manager.setEmail(FAKER.internet().emailAddress());
manager.setGoogleId(FAKER.number().digits(21));
manager.setImageUrl(FAKER.internet().url());
return manager;
}
}
package com.afp.ordermanagement.UNIT_TESTS.helper;
import com.github.javafaker.Faker;
//import com.sun.tools.javac.util.List;
import org.junit.jupiter.api.Assertions;
import static org.junit.jupiter.api.Assertions.*;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.lang.reflect.ParameterizedType;
import java.util.List;
public abstract class ValidatableEntity<E> {
private final Class<E> childClass;
static private final Faker FAKER = new Faker();
@SuppressWarnings("unchecked")
public ValidatableEntity() {
this.childClass = (
(Class<E>) (
(ParameterizedType) this.getClass()
.getGenericSuperclass()
)
.getActualTypeArguments()[0]
);
}
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
// assertFieldValidation(String fieldName, Object input, boolean isValidInput)
public ConstraintViolation<E> createViolation(String fieldName, Object fieldValue) {
return validator
.validateValue(this.childClass, fieldName, fieldValue)
.stream()
.findAny()
.orElse(null);
}
// assertFieldValidation(String fieldName, Object input, boolean isValidInput)
public void assertFieldValidation(String fieldName, Object input, boolean expected) {
boolean isValid = validator.validateValue(this.childClass, fieldName, input).isEmpty();
String v = expected ? "valid" : "invalid";
String errMsg = String.format("Expected '%s' to be a %s value for field '%s'", input, v, fieldName);
if (isValid != expected) fail(errMsg);
}
}
package com.afp.ordermanagement.UNIT_TESTS.model;
import com.afp.ordermanagement.UNIT_TESTS.helper.ValidatableEntity;
import com.afp.ordermanagement.model.Manager;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class ManagerTests extends ValidatableEntity<Manager> {
@ParameterizedTest
@CsvSource(value = {"null:false", "\"\":false", "Jerry:true"}, delimiter = ':')
public void shouldValidateNameFields(String input, boolean expected) {
assertFieldValidation("firstName", input, expected);
assertFieldValidation("lastName", input, expected);
}
@ParameterizedTest
@CsvSource(value = {"null:false", "\"\":false", "poop:false", "jerry@hotmail.com:true"}, delimiter = ':')
public void shouldValidateEmailField(String input, boolean expected) {
assertFieldValidation("email", input, expected);
}
@ParameterizedTest
@CsvSource(value = {"null:false", "\"\":false"}, delimiter = ':')
public void shouldValidateGoogleIdField(String input, boolean expected) {
assertFieldValidation("googleId", input, expected);
}
@ParameterizedTest
@CsvSource(value = {"\"\",false", "https://picsum.photos/200,true", "htps: picsum.photos/200,false"})
public void shouldValidateImageUrl(String input, boolean expected) {
assertFieldValidation("imageUrl", input, expected);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment