#614 - 'Matches for the concatenated key columns where not found' - tests

This commit is contained in:
Robin Bygrave
2016-03-23 17:01:43 +13:00
parent ae28599825
commit 577dbad9bd
7 changed files with 371 additions and 0 deletions
@@ -0,0 +1,10 @@
package com.avaje.tests.model.bridge;
/**
* Simple enum for our bridge table tests.
*/
public enum BAccessLevel {
ONE,
TWO,
THREE
}
@@ -0,0 +1,19 @@
package com.avaje.tests.model.bridge;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.UUID;
@Entity
public class BSite {
@Id
UUID id;
String name;
public BSite(String name) {
this.name = name;
}
}
@@ -0,0 +1,78 @@
package com.avaje.tests.model.bridge;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import java.util.UUID;
@Entity
public class BSiteUser {
@Embeddable
public static class Id {
// Use siteId, userId matching by db column naming convention
public UUID siteId;
public UUID userId;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Id id = (Id) o;
if (!siteId.equals(id.siteId)) return false;
return userId.equals(id.userId);
}
@Override
public int hashCode() {
int result = siteId.hashCode();
result = 31 * result + userId.hashCode();
return result;
}
}
@EmbeddedId
Id id;
private BAccessLevel accessLevel;
@ManyToOne(optional=false)
private final BSite site;
@ManyToOne(optional=false)
private final BUser user;
public BSiteUser(BAccessLevel accessLevel, BSite site, BUser user) {
this.accessLevel = accessLevel;
this.site = site;
this.user = user;
}
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
public BAccessLevel getAccessLevel() {
return accessLevel;
}
public BSite getSite() {
return site;
}
public BUser getUser() {
return user;
}
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
}
@@ -0,0 +1,78 @@
package com.avaje.tests.model.bridge;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import java.util.UUID;
@Entity
public class BSiteUserB {
@Embeddable
public static class Id {
// Use plain site and user matching by property name (not siteId, userId)
public UUID site;
public UUID user;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Id id = (Id) o;
if (!site.equals(id.site)) return false;
return user.equals(id.user);
}
@Override
public int hashCode() {
int result = site.hashCode();
result = 31 * result + user.hashCode();
return result;
}
}
@EmbeddedId
Id id;
private BAccessLevel accessLevel;
@ManyToOne(optional=false)
private final BSite site;
@ManyToOne(optional=false)
private final BUser user;
public BSiteUserB(BAccessLevel accessLevel, BSite site, BUser user) {
this.accessLevel = accessLevel;
this.site = site;
this.user = user;
}
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
public BAccessLevel getAccessLevel() {
return accessLevel;
}
public BSite getSite() {
return site;
}
public BUser getUser() {
return user;
}
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
}
@@ -0,0 +1,81 @@
package com.avaje.tests.model.bridge;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import java.util.UUID;
@Entity
public class BSiteUserC {
@Embeddable
public static class Id {
// matching by @JoinColumn (not naming convention or property name)
public UUID siteUid;
public UUID userUid;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Id id = (Id) o;
if (!siteUid.equals(id.siteUid)) return false;
return userUid.equals(id.userUid);
}
@Override
public int hashCode() {
int result = siteUid.hashCode();
result = 31 * result + userUid.hashCode();
return result;
}
}
@EmbeddedId
Id id;
private BAccessLevel accessLevel;
@ManyToOne(optional=false)
@JoinColumn(name = "site_uid", insertable = false, updatable = false)
private final BSite site;
@ManyToOne(optional=false)
@JoinColumn(name = "user_uid", insertable = false, updatable = false)
private final BUser user;
public BSiteUserC(BAccessLevel accessLevel, BSite site, BUser user) {
this.accessLevel = accessLevel;
this.site = site;
this.user = user;
}
public Id getId() {
return id;
}
public void setId(Id id) {
this.id = id;
}
public BAccessLevel getAccessLevel() {
return accessLevel;
}
public BSite getSite() {
return site;
}
public BUser getUser() {
return user;
}
public void setAccessLevel(BAccessLevel accessLevel) {
this.accessLevel = accessLevel;
}
}
@@ -0,0 +1,19 @@
package com.avaje.tests.model.bridge;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.UUID;
@Entity
public class BUser {
@Id
UUID id;
String name;
public BUser(String name) {
this.name = name;
}
}
@@ -0,0 +1,86 @@
package com.avaje.tests.model.bridge;
import com.avaje.ebean.BaseTestCase;
import com.avaje.ebean.Ebean;
import org.junit.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class TestExplicitM2MBridgeTable extends BaseTestCase {
@Test
public void test() {
BUser user = new BUser("Rob");
BSite site = new BSite("avaje.org");
Ebean.save(user);
Ebean.save(site);
insertUpdateBridge(user, site);
insertUpdateBridgeB(user, site);
insertUpdateBridgeC(user, site);
}
/**
* Test where matching by db column naming convention.
*/
private void insertUpdateBridge(BUser user, BSite site) {
BSiteUser access = new BSiteUser(BAccessLevel.ONE, site, user);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUser> list = Ebean.find(BSiteUser.class).findList();
assertThat(list).isNotEmpty();
for (BSiteUser bridge : list) {
assertThat(bridge.getId().siteId).isEqualTo(bridge.getSite().id);
assertThat(bridge.getId().userId).isEqualTo(bridge.getUser().id);
}
}
/**
* Test where matching by property name.
*/
private void insertUpdateBridgeB(BUser user, BSite site) {
BSiteUserB access = new BSiteUserB(BAccessLevel.ONE, site, user);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUserB> list = Ebean.find(BSiteUserB.class).findList();
assertThat(list).isNotEmpty();
for (BSiteUserB bridge : list) {
assertThat(bridge.getId().site).isEqualTo(bridge.getSite().id);
assertThat(bridge.getId().user).isEqualTo(bridge.getUser().id);
}
}
/**
* Test where matching by explicit @JoinColumn.
*/
private void insertUpdateBridgeC(BUser user, BSite site) {
BSiteUserC access = new BSiteUserC(BAccessLevel.ONE, site, user);
Ebean.save(access);
access.setAccessLevel(BAccessLevel.TWO);
Ebean.save(access);
List<BSiteUserC> list = Ebean.find(BSiteUserC.class).findList();
assertThat(list).isNotEmpty();
for (BSiteUserC bridge : list) {
assertThat(bridge.getId().siteUid).isEqualTo(bridge.getSite().id);
assertThat(bridge.getId().userUid).isEqualTo(bridge.getUser().id);
}
}
}