package org.javers.core.examples;
import org.javers.core.Javers;
import org.javers.core.JaversBuilder;
import org.javers.core.diff.Diff;
import org.javers.core.diff.changetype.*;
import org.javers.core.examples.model.Employee;
import org.junit.Test;
import static org.fest.assertions.api.Assertions.assertThat;
public class EmployeeHierarchiesDiffExample {
/** {@link ValueChange} example */
@Test
public void shouldDetectSalaryChange(){
//given
Javers javers = JaversBuilder.javers().build();
Employee oldBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Noisy Manager"),
new Employee("Great Developer", 10000));
Employee newBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Noisy Manager"),
new Employee("Great Developer", 20000));
//when
Diff diff = javers.compare(oldBoss, newBoss);
//then
ValueChange change = diff.getChangesByType(ValueChange.class).get(0);
assertThat(change.getAffectedLocalId()).isEqualTo("Great Developer");
assertThat(change.getPropertyName()).isEqualTo("salary");
assertThat(change.getLeft()).isEqualTo(10000);
assertThat(change.getRight()).isEqualTo(20000);
System.out.println(diff);
}
/** {@link NewObject} example */
@Test
public void shouldDetectHired() {
//given
Javers javers = JaversBuilder.javers().build();
Employee oldBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Great Developer"));
Employee newBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Great Developer"),
new Employee("Hired One"),
new Employee("Hired Second"));
//when
Diff diff = javers.compare(oldBoss, newBoss);
//then
assertThat(diff.getObjectsByChangeType(NewObject.class))
.hasSize(2)
.containsOnly(new Employee("Hired One"),
new Employee("Hired Second"));
System.out.println(diff);
}
/** {@link ReferenceChange} example */
@Test
public void shouldDetectBossChange() {
//given
Javers javers = JaversBuilder.javers().build();
Employee oldBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Manager One")
.addSubordinate(new Employee("Great Developer")),
new Employee("Manager Second"));
Employee newBoss = new Employee("Big Boss")
.addSubordinates(
new Employee("Manager One"),
new Employee("Manager Second")
.addSubordinate(new Employee("Great Developer")));
//when
Diff diff = javers.compare(oldBoss, newBoss);
//then
ReferenceChange change = diff.getChangesByType(ReferenceChange.class).get(0);
assertThat(change.getAffectedLocalId()).isEqualTo("Great Developer");
assertThat(change.getLeft().value()).endsWith("Manager One");
assertThat(change.getRight().value()).endsWith("Manager Second");
System.out.println(diff);
}
/** {@link NewObject} example, large structure */
@Test
public void shouldDetectFiredInLargeDepthStructure() {
//given
Javers javers = JaversBuilder.javers().build();
Employee oldBoss = new Employee("Big Boss");
Employee boss = oldBoss;
for (int i=0; i<1000; i++){
boss.addSubordinate(new Employee("Emp no."+i));
boss = boss.getSubordinates().get(0);
}
Employee newBoss = new Employee("Big Boss");
//when
Diff diff = javers.compare(oldBoss, newBoss);
//then
assertThat(diff.getChangesByType(ObjectRemoved.class)).hasSize(1000);
}
}