package service;
import api.v1.*;
import mapper.CustomerMapper;
import mapper.PositionMapper;
import models.CustomerModel;
import models.OrderModel;
import models.PositionModel;
import models.PositionTagModel;
import org.junit.Test;
import util.InMemoryDbTest;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import static org.junit.Assert.*;
public class PositionServiceTest extends InMemoryDbTest {
@Test
public void testIsDeletable() {
PositionService service = new PositionService(fakeUser);
//List<PositionModel> positions = service.getPositionsForCustomer(3L);
PositionModel p1 = service.findByName("Ekofisk");
assertFalse("Ekofisk is unexpectedly deletable", p1.isDeletable);
PositionModel p2 = service.findByName("Hewett");
assertTrue("Hewett is unexpectedly not deletable", service.isDeletable(p2.id));
OrderService orderService = new OrderService(fakeUser);
OrderModel order = orderService.getByMetref("ordertestdeleted");
assertNotNull(order.deleted);
assertNotNull("Bestilling ordertestdeleted har ingen posisjon ", order.position);
assertTrue("ordertestdeleted.position is unexpectedly not deletable", order.position.isDeletable);
}
@Test
public void testListAll() {
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.findAll();
assertNotNull("positions null", positions);
assertEquals("positionlist", 14, positions.size());
}
@Test
public void testGetCustomerPositions() {
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.getPositionsForCustomer(3L);
assertNotNull("positions null", positions);
assertEquals("positionlist", 3, positions.size());
assertEquals("p1.alias", "Echofish", positions.get(0).alias);
assertEquals("p2.alias", "Gullfaks", positions.get(1).alias);
assertEquals("Ekofisk tags", 3, positions.get(0).tags.size());
}
@Test
public void testSearchName() {
PositionService service = new PositionService(fakeUser);
PositionSearch searchParams = new PositionSearch();
searchParams.position_name = "Gull";
List<PositionModel> positions = service.search(searchParams);
assertNotNull("positions null", positions);
assertEquals("positionlist", 1, positions.size());
assertEquals("name ", "Gullfaks", positions.get(0).name);
assertNull("alias not null", positions.get(0).alias);
assertEquals("Gullfaks tags", 3, positions.get(0).tags.size());
}
@Test
public void testSearchDistance() {
PositionService service = new PositionService(fakeUser);
PositionSearch searchParams = new PositionSearch();
searchParams.position_name = "Veslefrikk";
searchParams.radius = 50.0;
List<PositionModel> positions = service.search(searchParams);
assertNotNull("positions null", positions);
assertEquals("positionlist", 7, positions.size());
}
@Test
public void testSearchBoundingBox() {
PositionService service = new PositionService(fakeUser);
PositionSearch searchParams = new PositionSearch();
searchParams.searchArea = new BoundingBox(55.7, 3.6, 57.0, 4);
List<PositionModel> positions = service.search(searchParams);
assertNotNull("positions null", positions);
assertEquals("positionlist", 3, positions.size());
}
@Test
public void testSearchTags() {
PositionService service = new PositionService(fakeUser);
PositionSearch searchParams = new PositionSearch();
searchParams.tags = new PositionTag[2];
searchParams.tags[0] = new PositionTag(0L, "United Kingdom");
searchParams.tags[1] = new PositionTag(0L, "Platform");
List<PositionModel> positions = service.search(searchParams);
assertNotNull("positions null", positions);
assertEquals("positionlist", 9, positions.size());
}
@Test
public void testAddPositionTag() {
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.getPositionsForCustomer(3L);
PositionModel positionModel = positions.get(0);
Position position = new PositionMapper().mapToApi(positionModel);
position.tags = new PositionTag[position.tags.length + 1];
int i = 0;
for (Iterator<PositionTagModel> itr = positionModel.tags.iterator(); itr.hasNext(); i++) {
PositionTagModel positionTagModel = itr.next();
position.tags[i] = new PositionTag(positionTagModel.id, positionTagModel.name);
}
position.tags[position.tags.length - 1] = new PositionTag(0L, "Dummy");
PositionModel p2 = service.createOrUpdate(position);
assertEquals("Tags size", positionModel.tags.size() + 1, p2.tags.size());
}
@Test
public void testModifyPositionTags() {
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.getPositionsForCustomer(3L);
PositionModel positionModel = positions.get(0);
Position position = new PositionMapper().mapToApi(positionModel);
position.tags = new PositionTag[position.tags.length];
int i = 0;
for (Iterator<PositionTagModel> itr = positionModel.tags.iterator(); itr.hasNext(); i++) {
PositionTagModel positionTagModel = itr.next();
position.tags[i] = new PositionTag(positionTagModel.id, positionTagModel.name);
}
position.tags[0] = new PositionTag(0L, "ZZZ");
PositionModel p2 = service.createOrUpdate(position);
assertEquals("Tags size", positionModel.tags.size(), p2.tags.size());
// Note that createOrUpdate does not sort the tags. When fetching the
// position from the database the tag order will be sorted
assertEquals("T1", "ZZZ", p2.tags.get(0).name);
assertEquals("T2", "Nordsjøen", p2.tags.get(1).name);
assertEquals("T3", "Norge", p2.tags.get(2).name);
PositionModel p3 = service.getById(p2.id);
assertEquals("T1", "Nordsjøen", p3.tags.get(0).name);
assertEquals("T2", "Norge", p3.tags.get(1).name);
assertEquals("T3", "ZZZ", p3.tags.get(2).name);
}
@Test
public void testDeletePositionTags() {
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.getPositionsForCustomer(3L);
PositionModel positionModel = positions.get(0);
Position position = new PositionMapper().mapToApi(positionModel);
// remove the last tag by iterating up to, but not including
// final element
position.tags = new PositionTag[position.tags.length - 1];
int i = 0;
for (Iterator<PositionTagModel> itr = positionModel.tags.iterator(); i < position.tags.length; i++) {
PositionTagModel positionTagModel = itr.next();
position.tags[i] = new PositionTag(positionTagModel.id, positionTagModel.name);
}
assertEquals("T1", "Atlanterhavet", position.tags[0].name);
assertEquals("T2", "Nordsjøen", position.tags[1].name);
PositionModel p2 = service.createOrUpdate(position);
assertEquals("Tags size", positionModel.tags.size() - 1, p2.tags.size());
PositionTagModel[] p2Tags = p2.tags.toArray(new PositionTagModel[positionModel.tags.size()]);
assertEquals("T1", "Atlanterhavet", p2Tags[0].name);
assertEquals("T2", "Nordsjøen", p2Tags[1].name);
}
@Test
public void testDeletePosition() {
PositionService service = new PositionService(fakeUser);
PositionModel p = service.findByName("Vulcan");
assertNotNull("not null", p);
assertTrue("is not deletable", p.isDeletable);
p = service.deletePosition(p);
assertNotNull(p.deleted);
assertNotNull(p.deletedBy);
}
@Test
public void testDeleteAndCreatePosition() {
PositionService service = new PositionService(fakeUser);
PositionModel p = service.findByName("Vulcan");
p = service.deletePosition(p);
assertNotNull("deleted is null", p.deleted);
assertNotNull("deletedBy is null", p.deletedBy);
Position apiPos = new PositionMapper().mapToApi(p);
apiPos.id = null;
p = service.createOrUpdate(apiPos);
assertNull("deleted is not null", p.deleted);
assertNull("deletedBy is not null", p.deletedBy);
}
@Test
public void testMultiplePositionAliases() {
long customerId = 1L;
long positionId = 9L;
OrderModel bestilling = createNewOrderReferencingExistingPositionWithAlias(customerId, positionId);
PositionService service = new PositionService(fakeUser);
List<PositionModel> positions = service.getPositionsForCustomer(customerId);
assertNotNull("positions null", positions);
assertEquals("positionlist", 4, positions.size());
PositionModel p1 = positions.get(2);
PositionModel p2 = positions.get(3);
assertEquals("p1.id", positionId, (long) p1.id);
assertEquals("p2.id", positionId, (long) p2.id);
assertEquals("p1.name", "Huldra", p1.name);
assertEquals("p2.name", "Huldra", p2.name);
// det originale position objektet har ikke noe alias
assertNull("p1.alias", p1.alias);
assertEquals("p2.alias", "Huldra_alias", p2.alias);
}
private OrderModel createNewOrderReferencingExistingPositionWithAlias(Long customerId, Long positionId) {
Order aOrder = new Order();
aOrder.customer_email = "test@example.com";
aOrder.customer_name = "Test";
aOrder.customer_phone = "123";
CustomerModel customerModel = new CustomerService(fakeUser).getById(customerId);
Customer customer = new CustomerMapper().mapToApi(customerModel);
aOrder.customer = customer;
aOrder.custref_po_calloff = "32123";
aOrder.met_ref = "111222";
aOrder.start_date1 = new Date();
aOrder.start_termin1 = 3;
aOrder.end_date1 = new Date();
aOrder.end_termin1 = 21;
aOrder.info_for_meteorologist = "Bla bla";
aOrder.other_info = "More bla bla";
for (int i = 0; i < aOrder.termins1.length; i++) {
aOrder.termins1[i] = new Termin(i * 3, i % 3 == 0);
}
// Hent eksisterende posisjon
PositionModel positionModel = new PositionService(fakeUser).getById(positionId);
Position position = new PositionMapper().mapToApi(positionModel);
// referer til posisjonen i bestillingen
aOrder.position = position;
// tilordne et alias på posisjonen
aOrder.position_name = position.name + "_alias";
// ingen distribusjon
aOrder.recipients = new ArrayList<>();
// opprett bestillingen
OrderModel order = new OrderService(fakeUser).createOrUpdate(aOrder);
return order;
}
}