package org.tests.softdelete;
import io.ebean.BaseTestCase;
import io.ebean.Ebean;
import io.ebean.Query;
import org.tests.model.softdelete.ESoftDelBook;
import org.tests.model.softdelete.ESoftDelUser;
import org.junit.Test;
import java.util.Arrays;
import static org.assertj.core.api.Assertions.assertThat;
public class TestSoftDeleteBook extends BaseTestCase {
@Test
public void test() {
// Create users
ESoftDelUser user1 = new ESoftDelUser("user1");
Ebean.save(user1);
ESoftDelUser user2 = new ESoftDelUser("user2");
Ebean.save(user2);
ESoftDelUser user3 = new ESoftDelUser("user3");
Ebean.save(user3);
// Create books
ESoftDelBook book1 = new ESoftDelBook("book1");
book1.setLendBy(user1);
book1.setLendBys(Arrays.asList(user2, user3));
Ebean.save(book1);
ESoftDelBook book2 = new ESoftDelBook("book2");
book2.setLendBy(user2);
book2.setLendBys(Arrays.asList(user1, user3));
Ebean.save(book2);
// check if everything is stored correctly in DB
book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").findUnique();
book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").findUnique();
assertThat(book1.getLendBys().size()).isEqualTo(2);
assertThat(book2.getLendBys().size()).isEqualTo(2);
assertThat(book1.getLendBy().getUserName()).isEqualTo("user1");
assertThat(book2.getLendBy().getUserName()).isEqualTo("user2");
// delete user 1
Ebean.delete(user1);
// check if everything is still stored correctly in DB (softdeletes included)
book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").setIncludeSoftDeletes().findUnique();
book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").setIncludeSoftDeletes().findUnique();
assertThat(book1.getLendBys().size()).isEqualTo(2);
assertThat(book2.getLendBys().size()).isEqualTo(2);
assertThat(book1.getLendBy().getUserName()).isEqualTo("user1");
assertThat(book2.getLendBy().getUserName()).isEqualTo("user2");
// check without softdeletes included
book1 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book1").findUnique();
book2 = Ebean.find(ESoftDelBook.class).where().eq("bookTitle", "book2").findUnique();
assertThat(book1.getLendBys().size()).isEqualTo(2); // user2 & user3
assertThat(book2.getLendBys().size()).isEqualTo(1); // user1 (deleted) & user3
assertThat(book2.getLendBy().getUserName()).isEqualTo("user2");
// expected behaviour:
// book1.getLendBy() == null
// current behaviour:
// book1.getLendBy() is a "dead" object. nearly every operation on the
// user object leads into an EntityNotFoundException
// lendBy is not null (as FK key value set, lendBy is non null reference bean)
ESoftDelUser lendBy = book1.getLendBy();
assertThat(lendBy.isDeleted()).isTrue();
}
@Test
public void test_fetch_whenAllManySoftDeleted() {
// Create users
ESoftDelUser user1 = new ESoftDelUser("user1");
Ebean.save(user1);
ESoftDelUser user2 = new ESoftDelUser("user2");
Ebean.save(user2);
// Create books
ESoftDelBook book1 = new ESoftDelBook("book3");
book1.setLendBy(user1);
book1.setLendBys(Arrays.asList(user1, user2));
Ebean.save(book1);
Ebean.delete(user1);
Ebean.delete(user2);
Query<ESoftDelBook> query = Ebean.find(ESoftDelBook.class)
.setId(book1.getId())
.fetch("lendBys");
ESoftDelBook found = query.findUnique();
assertThat(found).isNotNull();
}
}