package org.multibit.mbm.db.dao.hibernate;
import com.google.common.base.Optional;
import org.junit.Test;
import org.multibit.mbm.db.dao.UserDao;
import org.multibit.mbm.core.model.ContactMethod;
import org.multibit.mbm.core.model.ContactMethodDetail;
import org.multibit.mbm.core.model.User;
import org.multibit.mbm.core.model.UserBuilder;
import org.multibit.mbm.test.BaseIntegrationTests;
import org.springframework.test.context.ContextConfiguration;
import javax.annotation.Resource;
import java.util.List;
import static junit.framework.Assert.assertTrue;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
/**
* Integration test to verify the Hibernate annotations of the DTOs against a generated schema
*/
@ContextConfiguration(locations = {"/spring/test-mbm-context.xml"})
public class HibernateUserDaoIntegrationTest extends BaseIntegrationTests {
@Resource(name= "hibernateUserDao")
UserDao testObject;
/**
* Verifies User creation and updates work against ContactMethods
*/
@Test
public void testPersistAndFind() {
String apiKey="abc123";
String secretKey="1234-5678";
User expected = UserBuilder.newInstance()
.withApiKey(apiKey)
.withSecretKey(secretKey)
.build();
expected.setApiKey(apiKey);
// Persist with insert
int originalUserRows = countRowsInTable("users");
int originalContactMethodDetailRows = countRowsInTable("contact_method_details");
int originalContactMethodDetailSecondaryRows = countRowsInTable("contact_method_secondary_details");
testObject.saveOrUpdate(expected);
// Session flush: Expect an insert in users only
int updatedUserRows = countRowsInTable("users");
int updatedContactMethodDetailRows = countRowsInTable("contact_method_details");
int updatedContactMethodDetailSecondaryRows = countRowsInTable("contact_method_secondary_details");
assertThat("Expected session flush for first insert", updatedUserRows, equalTo(originalUserRows+1));
assertThat("Unexpected data in contact_method_details", updatedContactMethodDetailRows, equalTo(originalContactMethodDetailRows));
assertThat("Unexpected data in contact_method_secondary_details", updatedContactMethodDetailSecondaryRows, equalTo(originalContactMethodDetailSecondaryRows));
// Perform an update to the User that cascades to an insert in ContactMethod (but not secondary)
ContactMethodDetail contactMethodDetail = new ContactMethodDetail();
contactMethodDetail.setPrimaryDetail("test@example.org");
expected.setContactMethodDetail(ContactMethod.EMAIL, contactMethodDetail);
expected=testObject.saveOrUpdate(expected);
testObject.flush();
// Session flush: Expect no change to users, insert into contact_method_details
// Note that contactMethodDetail is now a different instance from the persistent one
updatedUserRows = countRowsInTable("users");
updatedContactMethodDetailRows = countRowsInTable("contact_method_details");
updatedContactMethodDetailSecondaryRows = countRowsInTable("contact_method_secondary_details");
assertThat("Unexpected data in users", updatedUserRows, equalTo(originalUserRows+1));
assertThat("Expected data in contact_method_details", updatedContactMethodDetailRows, equalTo(originalContactMethodDetailRows+1));
assertThat("Unexpected data in contact_method_secondary_details", updatedContactMethodDetailSecondaryRows, equalTo(originalContactMethodDetailSecondaryRows));
// Perform an update to the User that cascades to an insert in secondary ContactMethod
// due to an addition to the linked reference
contactMethodDetail = expected.getContactMethodDetail(ContactMethod.EMAIL);
contactMethodDetail.getSecondaryDetails().add("test2@example.org");
expected=testObject.saveOrUpdate(expected);
testObject.flush();
// Session flush: Expect no change to users, contact_method_details, insert into contact_method_secondary_details
updatedUserRows = countRowsInTable("users");
updatedContactMethodDetailRows = countRowsInTable("contact_method_details");
updatedContactMethodDetailSecondaryRows = countRowsInTable("contact_method_secondary_details");
assertThat("Unexpected data in users", updatedUserRows, equalTo(originalUserRows+1));
assertThat("Unexpected data in contact_method_details", updatedContactMethodDetailRows, equalTo(originalContactMethodDetailRows+1));
assertThat("Unexpected data in contact_method_secondary_details", updatedContactMethodDetailSecondaryRows, equalTo(originalContactMethodDetailSecondaryRows+1));
// Query against the "openId"
Optional<User> actual=testObject.getByApiKey("abc123");
// Session flush: Expect no change to users, contact_method_details, contact_method_secondary_details
updatedUserRows = countRowsInTable("users");
updatedContactMethodDetailRows = countRowsInTable("contact_method_details");
updatedContactMethodDetailSecondaryRows = countRowsInTable("contact_method_secondary_details");
assertThat("Unexpected data in users",updatedUserRows, equalTo(originalUserRows+1));
assertThat("Unexpected data in contact_method_details",updatedContactMethodDetailRows, equalTo(originalContactMethodDetailRows+1));
assertThat("Unexpected data in contact_method_secondary_details", updatedContactMethodDetailSecondaryRows, equalTo(originalContactMethodDetailSecondaryRows+1));
assertThat(actual.get(),equalTo(expected));
}
/**
* Verifies that data loading occurred as expected
*/
@Test
public void testUsersAndRoles() {
Optional<User> aliceCustomer = testObject.getByApiKey("alice123");
assertTrue("Expected pre-populated data", aliceCustomer.isPresent());
assertThat("Unexpected number of Roles",aliceCustomer.get().getUserRoles().size(), equalTo(1));
}
/**
* Verifies that paging works as expected
*/
@Test
public void testPaging() {
List<User> users = testObject.getAllByPage(1,0);
// Trent the admin is built first
assertNotNull("Expected pre-populated data (page 1)",users);
assertThat("Unexpected number of Users",users.size(), equalTo(1));
assertThat("Unexpected ordering of Users",users.get(0).getUsername(), equalTo("trent"));
users = testObject.getAllByPage(1,1);
// Alice the customer is built second
assertNotNull("Expected pre-populated data (page 2)",users);
assertThat("Unexpected number of Users",users.size(), equalTo(1));
assertThat("Unexpected ordering of Users",users.get(0).getUsername(), equalTo("cameron"));
}
}