// Copyright © 2015 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.back;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import java.util.List;
import java.util.UUID;
import javax.inject.Inject;
import org.junit.Test;
import fi.hsl.parkandride.core.back.ContactRepository;
import fi.hsl.parkandride.core.back.OperatorRepository;
import fi.hsl.parkandride.core.domain.*;
import fi.hsl.parkandride.core.service.ValidationException;
public class ContactDaoTest extends AbstractDaoTest {
private static MultilingualString NAME = new MultilingualString("name");
private static MultilingualString OPENING_HOURS = new MultilingualString("opening hours");
private static MultilingualString INFO = new MultilingualString("info");
private static String EMAIL = "test@example.com";
private static Phone PHONE = new Phone("09 1234567");
private static Address ADDRESS = new Address("street", "12345", "city");
@Inject
ContactRepository contactDao;
@Inject
OperatorRepository operatorRepository;
@Test
public void create_read_update() {
Contact contact = createContact();
final long id = contactDao.insertContact(contact);
assertThat(id).isGreaterThan(0);
contact = contactDao.getContact(id);
assertDefault(contact);
List<Contact> contacts = contactDao.findContacts(new ContactSearch()).results;
assertThat(contacts).hasSize(1);
assertDefault(contacts.get(0));
// Generic contacts are returned with operatoId search option
ContactSearch search = new ContactSearch();
search.setOperatorId(-123l);
assertThat(contactDao.findContacts(search).results).hasSize(1);
final MultilingualString newName = new MultilingualString("changed name");
final MultilingualString newOpeningHours = new MultilingualString("changed opening hours");
final MultilingualString newInfo = new MultilingualString("changed info");
final String newEmail = "example@example.com";
final Phone newPhone = new Phone("0800 123456");
final Address newAddress = new Address("changed street", "23456", "changed city");
contact.name = newName;
contact.openingHours = newOpeningHours;
contact.info = newInfo;
contact.email = newEmail;
contact.phone = newPhone;
contact.address = newAddress;
contact.operatorId = operatorRepository.insertOperator(new Operator(UUID.randomUUID().toString()));
contactDao.updateContact(id, contact);
contact = contactDao.getContact(id);
assertThat(contact.name).isEqualTo(newName);
assertThat(contact.email).isEqualTo(newEmail);
assertThat(contact.phone).isEqualTo(newPhone);
assertThat(contact.address).isEqualTo(newAddress);
assertThat(contact.openingHours).isEqualTo(newOpeningHours);
assertThat(contact.info).isEqualTo(newInfo);
// Matches given operatorId
search.setOperatorId(contact.operatorId);
assertThat(contactDao.findContacts(search).results).hasSize(1);
// But doesn't match other operatorId
search.setOperatorId(-123l);
assertThat(contactDao.findContacts(search).results).isEmpty();
}
@Test
public void unique_name() {
Contact contact = createContact();
contactDao.insertContact(contact);
verifyUniqueName(contact, "fi");
verifyUniqueName(contact, "sv");
verifyUniqueName(contact, "en");
}
private void verifyUniqueName(Contact contact, String lang) {
contact.name = new MultilingualString("something else");
try {
contact.name.asMap().put(lang, NAME.asMap().get(lang));
contactDao.insertContact(contact);
fail("should not allow duplicate names");
} catch (ValidationException e) {
assertThat(e.violations).hasSize(1);
assertThat(e.violations.get(0).path).isEqualTo("name." + lang);
}
}
private void assertDefault(Contact contact) {
assertThat(contact.name).isEqualTo(NAME);
assertThat(contact.email).isEqualTo(EMAIL);
assertThat(contact.phone).isEqualTo(PHONE);
assertThat(contact.address).isEqualTo(ADDRESS);
assertThat(contact.openingHours).isEqualTo(OPENING_HOURS);
assertThat(contact.info).isEqualTo(INFO);
}
private Contact createContact() {
Contact contact = new Contact();
contact.name = NAME;
contact.email = EMAIL;
contact.phone = PHONE;
contact.address = ADDRESS;
contact.openingHours = OPENING_HOURS;
contact.info = INFO;
return contact;
}
}