Refactor move tests from ebean-core to ebean-test

This commit is contained in:
rbygrave committed 2021-09-08 22:49:23 +12:00
1 parent 0b00a14fd3
commit eab56d323b
1650 files changed
+185 -147

No files matched your search

@@ -0,0 +1,14 @@
package org.multitenant.partition;
import io.ebean.config.CurrentTenantProvider;
class CurrentTenant implements CurrentTenantProvider {
/**
* Return the current tenantId from the user context.
*/
@Override
public String currentId() {
return UserContext.get().getTenantId();
}
}
@@ -0,0 +1,57 @@
package org.multitenant.partition;
import io.ebean.annotation.WhenCreated;
import io.ebean.annotation.WhenModified;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;
import java.time.Instant;
@MappedSuperclass
public abstract class MtBaseDomain {
@Id
long id;
@WhenModified
Instant whenModified;
@WhenCreated
Instant whenCreated;
@Version
long version;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public Instant getWhenModified() {
return whenModified;
}
public void setWhenModified(Instant whenModified) {
this.whenModified = whenModified;
}
public Instant getWhenCreated() {
return whenCreated;
}
public void setWhenCreated(Instant whenCreated) {
this.whenCreated = whenCreated;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -0,0 +1,32 @@
package org.multitenant.partition;
import javax.persistence.Entity;
@Entity
public class MtContent extends MtTenantAware {
String title;
String body;
public MtContent(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
@@ -0,0 +1,67 @@
package org.multitenant.partition;
import io.ebean.annotation.Length;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Version;
@Entity
public class MtTenant {
@Id
final String id;
@Length(50)
String name;
@Length(50)
String email;
String notes;
@Version
long version;
public MtTenant(String id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
@@ -0,0 +1,22 @@
package org.multitenant.partition;
import io.ebean.annotation.TenantId;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class MtTenantAware extends MtBaseDomain {
@TenantId
@ManyToOne(optional = false)
MtTenant tenant;
public MtTenant getTenant() {
return tenant;
}
public void setTenant(MtTenant tenant) {
this.tenant = tenant;
}
}
@@ -0,0 +1,130 @@
package org.multitenant.partition;
import io.ebean.BaseTestCase;
import io.ebean.Database;
import io.ebean.DatabaseFactory;
import io.ebean.config.DatabaseConfig;
import io.ebean.config.TenantMode;
import org.ebeantest.LoggedSqlCollector;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public class MultiTenantPartitionTest extends BaseTestCase {
private static final String[] names = {"Ace", "Base", "Case", "Dae", "Eva"};
static List<MtTenant> tenants() {
List<MtTenant> tenants = new ArrayList<>();
for (int i = 0; i < 5; i++) {
tenants.add(new MtTenant("ten_"+i, names[i], names[i]+"@foo.com".toLowerCase()));
}
return tenants;
}
private static final Database server = init();
static {
server.saveAll(tenants());
}
@AfterAll
public static void shutdown() {
server.shutdown();
}
@Test
public void start() {
UserContext.set("rob", "ten_1");
LoggedSqlCollector.start();
MtContent content = new MtContent("first title");
server.save(content);
List<String> sql = LoggedSqlCollector.current();
assertSql(sql.get(0)).contains("insert into mt_content (title, body, when_modified, when_created, version, tenant_id) values (?,?,?,?,?,?)");
content.setBody("some body");
server.save(content);
sql = LoggedSqlCollector.current();
assertSql(sql.get(0)).contains("update mt_content set body=?, when_modified=?, version=? where id=? and tenant_id=? and version=?");
server.delete(content);
sql = LoggedSqlCollector.current();
assertSql(sql.get(0)).contains("delete from mt_content where id=? and tenant_id=? and version=?");
LoggedSqlCollector.stop();
}
@Test
public void deleteById() {
UserContext.set("fred", "ten_2");
MtContent content = new MtContent("first title");
server.save(content);
LoggedSqlCollector.start();
int rows = server.delete(MtContent.class, content.getId());
List<String> sql = LoggedSqlCollector.stop();
assertSql(sql.get(0)).contains("delete from mt_content where id=? and tenant_id=?");
assertThat(rows).isEqualTo(1);
rows = server.delete(MtContent.class, 99999);
assertThat(rows).isEqualTo(0);
}
@Test
public void deleteByIds() {
UserContext.set("fred", "ten_2");
MtContent a = newContent("title a");
MtContent b = newContent("title b");
List<Long> ids = Arrays.asList(a.getId(), b.getId(), 99998L);
LoggedSqlCollector.start();
int rows = server.deleteAll(MtContent.class, ids);
assertThat(rows).isEqualTo(2);
List<String> sql = LoggedSqlCollector.stop();
assertSql(sql.get(0)).contains("delete from mt_content where id=? and tenant_id=?");
}
private MtContent newContent(String title) {
MtContent content = new MtContent(title);
server.save(content);
return content;
}
private static Database init() {
DatabaseConfig config = new DatabaseConfig();
config.setName("h2multitenant");
config.loadFromProperties();
config.setDdlGenerate(true);
config.setDdlRun(true);
config.setDdlExtra(false);
config.setRegister(false);
config.setDefaultServer(false);
config.setCurrentTenantProvider(new CurrentTenant());
config.setTenantMode(TenantMode.PARTITION);
config.getClasses().add(MtTenant.class);
config.getClasses().add(MtContent.class);
return DatabaseFactory.create(config);
}
}
@@ -0,0 +1,46 @@
package org.multitenant.partition;
public final class UserContext {
private static final UserContextThreadLocal local = new UserContextThreadLocal();
private String userId;
private String tenantId;
private UserContext(String userId, String tenantId) {
this.userId = userId;
this.tenantId = tenantId;
}
private UserContext() {
}
public String getUserId() {
return userId;
}
public String getTenantId() {
return tenantId;
}
public static UserContext get() {
return local.get();
}
public static void reset() {
local.remove();
}
public static void set(String userId, String tenantId) {
local.set(new UserContext(userId, tenantId));
}
private static class UserContextThreadLocal extends ThreadLocal<UserContext> {
@Override
protected UserContext initialValue() {
return new UserContext();
}
}
}