/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.resource.accesscontrol;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import java.util.List;
import java.util.UUID;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.olat.core.commons.persistence.DB;
import org.olat.core.commons.persistence.SortKey;
import org.olat.core.id.Identity;
import org.olat.core.id.OLATResourceable;
import org.olat.core.util.CodeHelper;
import org.olat.resource.OLATResource;
import org.olat.resource.OLATResourceImpl;
import org.olat.resource.OLATResourceManager;
import org.olat.resource.accesscontrol.manager.ACMethodDAO;
import org.olat.resource.accesscontrol.manager.ACOfferDAO;
import org.olat.resource.accesscontrol.manager.ACOrderDAO;
import org.olat.resource.accesscontrol.manager.ACTransactionDAO;
import org.olat.resource.accesscontrol.model.AccessMethod;
import org.olat.resource.accesscontrol.model.AccessTransactionStatus;
import org.olat.resource.accesscontrol.model.FreeAccessMethod;
import org.olat.resource.accesscontrol.model.PriceImpl;
import org.olat.resource.accesscontrol.model.RawOrderItem;
import org.olat.resource.accesscontrol.model.TokenAccessMethod;
import org.olat.resource.accesscontrol.ui.OrdersDataModel.OrderCol;
import org.olat.test.JunitTestHelper;
import org.olat.test.OlatTestCase;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* Description:<br>
* test the order manager
*
* <P>
* Initial Date: 19 avr. 2011 <br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*/
public class ACOrderManagerTest extends OlatTestCase {
private static Identity ident1, ident2, ident3;
private static Identity ident4, ident5, ident6;
private static Identity ident7, ident8;
private static boolean isInitialized = false;
@Autowired
private DB dbInstance;
@Autowired
private ACOfferDAO acOfferManager;
@Autowired
private ACTransactionDAO acTransactionManager;
@Autowired
private ACService acService;
@Autowired
private ACMethodDAO acMethodManager;
@Autowired
private OLATResourceManager resourceManager;
@Autowired
private ACOrderDAO acOrderManager;
@Before
public void setUp() {
if(!isInitialized) {
ident1 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident2 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident3 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident4 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident5 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident6 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident7 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
ident8 = JunitTestHelper.createAndPersistIdentityAsUser(UUID.randomUUID().toString().replace("-", ""));
}
}
@Test
public void testManagers() {
assertNotNull(acOfferManager);
assertNotNull(acService);
assertNotNull(dbInstance);
assertNotNull(acMethodManager);
assertNotNull(acOrderManager);
}
@Test
public void testSaveOrder() {
//create an offer to buy
OLATResource randomOres = createResource();
Offer offer = acService.createOffer(randomOres, "TestSaveOrder");
offer = acService.save(offer);
dbInstance.commitAndCloseSession();
//create and save an order
Order order = acOrderManager.createOrder(ident1);
OrderPart part = acOrderManager.addOrderPart(order);
OrderLine item = acOrderManager.addOrderLine(part, offer);
assertNotNull(order);
assertNotNull(order.getDelivery());
assertEquals(ident1, order.getDelivery());
acOrderManager.save(order);
dbInstance.commitAndCloseSession();
//check what's on DB
Order retrievedOrder = acOrderManager.loadOrderByKey(order.getKey());
assertNotNull(retrievedOrder);
assertNotNull(retrievedOrder.getDelivery());
assertEquals(ident1, retrievedOrder.getDelivery());
assertEquals(order, retrievedOrder);
List<OrderPart> parts = retrievedOrder.getParts();
assertNotNull(parts);
assertEquals(1, parts.size());
assertEquals(part, parts.get(0));
OrderPart retrievedPart = parts.get(0);
assertNotNull(retrievedPart.getOrderLines());
assertEquals(1, retrievedPart.getOrderLines().size());
assertEquals(item, retrievedPart.getOrderLines().get(0));
OrderLine retrievedItem = retrievedPart.getOrderLines().get(0);
assertNotNull(retrievedItem.getOffer());
assertEquals(offer, retrievedItem.getOffer());
}
@Test
public void findOrderItems_1() {
//create an offer to buy
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(TokenAccessMethod.class);
assertNotNull(methods);
assertEquals(1, methods.size());
AccessMethod tokenMethod = methods.get(0);
OLATResource randomOres = createResource();
Offer offer = acService.createOffer(randomOres, "TestSaveOrder");
offer = acService.save(offer);
dbInstance.commitAndCloseSession();
//create and save an order
Order order = acOrderManager.createOrder(ident1);
OrderPart part = acOrderManager.addOrderPart(order);
OrderLine line = acOrderManager.addOrderLine(part, offer);
order = acOrderManager.save(order);
Assert.assertNotNull(order);
Assert.assertNotNull(order.getDelivery());
Assert.assertNotNull(line);
Assert.assertEquals(ident1, order.getDelivery());
dbInstance.commitAndCloseSession();
AccessTransaction accessTransaction = acTransactionManager.createTransaction(order, part, tokenMethod);
assertNotNull(accessTransaction);
acTransactionManager.save(accessTransaction);
AccessTransaction accessTransaction2 = acTransactionManager.createTransaction(order, part, tokenMethod);
assertNotNull(accessTransaction2);
acTransactionManager.save(accessTransaction2);
dbInstance.commitAndCloseSession();
acTransactionManager.update(accessTransaction, AccessTransactionStatus.NEW);
acTransactionManager.update(accessTransaction2, AccessTransactionStatus.CANCELED);
long start = System.nanoTime();
List<RawOrderItem> items = acOrderManager.findNativeOrderItems(randomOres, null, null, null, null, null, 0, -1, null);
CodeHelper.printNanoTime(start, "Order itemized");
Assert.assertNotNull(items);
//check the order by
for(OrderCol col:OrderCol.values()) {
List<RawOrderItem> rawItems = acOrderManager.findNativeOrderItems(randomOres, null, null, null, null, null,
0, -1, null, new SortKey(col.sortKey(), false));
Assert.assertNotNull(rawItems);
}
}
@Test
public void findOrderItems() {
//create an offer to buy
OLATResource randomOres = createResource();
Offer offer = acService.createOffer(randomOres, "TestSaveOrder");
offer = acService.save(offer);
dbInstance.commitAndCloseSession();
//create and save an order
Order order = acOrderManager.createOrder(ident1);
OrderPart part = acOrderManager.addOrderPart(order);
OrderLine line = acOrderManager.addOrderLine(part, offer);
order = acOrderManager.save(order);
Assert.assertNotNull(order);
Assert.assertNotNull(order.getDelivery());
Assert.assertNotNull(line);
Assert.assertEquals(ident1, order.getDelivery());
dbInstance.commitAndCloseSession();
long start = System.nanoTime();
List<RawOrderItem> items = acOrderManager.findNativeOrderItems(randomOres, null, null, null, null, null, 0, -1, null);
CodeHelper.printNanoTime(start, "Order itemized");
Assert.assertNotNull(items);
}
@Test
public void testSaveOneClickOrders() {
//create some offers to buy
OLATResource randomOres1 = createResource();
Offer offer1 = acService.createOffer(randomOres1, "TestSaveOneClickOrders 1");
offer1 = acService.save(offer1);
OLATResource randomOres2 = createResource();
Offer offer2 = acService.createOffer(randomOres2, "TestSaveOneClickOrders 2");
offer2 = acService.save(offer2);
dbInstance.commitAndCloseSession();
//create a link offer to method
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(TokenAccessMethod.class);
assertNotNull(methods);
assertEquals(1, methods.size());
AccessMethod method = methods.get(0);
OfferAccess access1 = acMethodManager.createOfferAccess(offer1, method);
acMethodManager.save(access1);
OfferAccess access2 = acMethodManager.createOfferAccess(offer2, method);
acMethodManager.save(access2);
dbInstance.commitAndCloseSession();
//one clicks
acOrderManager.saveOneClick(ident1, access1);
acOrderManager.saveOneClick(ident2, access2);
acOrderManager.saveOneClick(ident3, access1);
acOrderManager.saveOneClick(ident3, access2);
dbInstance.commitAndCloseSession();
//retrieves by identity
List<Order> ordersIdent3 = acOrderManager.findOrdersByDelivery(ident3);
assertEquals(2, ordersIdent3.size());
assertEquals(ident3, ordersIdent3.get(0).getDelivery());
assertEquals(ident3, ordersIdent3.get(1).getDelivery());
//retrieves by resource
List<Order> ordersResource2 = acOrderManager.findOrdersByResource(randomOres2);
assertEquals(2, ordersResource2.size());
}
@Test
public void testSaveOneClickOrder() {
//make extensiv test on one order
//create some offers to buy
OLATResource randomOres1 = createResource();
Offer offer = acService.createOffer(randomOres1, "TestSaveOneClickOrder 1");
offer = acService.save(offer);
dbInstance.commitAndCloseSession();
//create a link offer to method
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(FreeAccessMethod.class);
Assert.assertNotNull(methods);
Assert.assertEquals(1, methods.size());
AccessMethod method = methods.get(0);
OfferAccess access1 = acMethodManager.createOfferAccess(offer, method);
acMethodManager.save(access1);
dbInstance.commitAndCloseSession();
//one clicks
Order order = acOrderManager.saveOneClick(ident7, access1);
dbInstance.commitAndCloseSession();
//load order
Order retrivedOrder = acOrderManager.loadOrderByKey(order.getKey());
Assert.assertNotNull(retrivedOrder);
Assert.assertNotNull(retrivedOrder.getCreationDate());
Assert.assertNotNull(retrivedOrder.getDelivery());
Assert.assertNotNull(retrivedOrder.getOrderNr());
Assert.assertNotNull(retrivedOrder.getParts());
Assert.assertEquals(ident7, retrivedOrder.getDelivery());
Assert.assertEquals(1, retrivedOrder.getParts().size());
OrderPart orderPart = retrivedOrder.getParts().get(0);
Assert.assertNotNull(orderPart);
Assert.assertEquals(1, orderPart.getOrderLines().size());
OrderLine line = orderPart.getOrderLines().get(0);
Assert.assertNotNull(line);
Assert.assertNotNull(line.getOffer());
Assert.assertEquals(offer, line.getOffer());
}
@Test
public void testSaveOneClickOrderWithPrice() {
//make extensiv test on one order
//create some offers to buy
OLATResource randomOres1 = createResource();
Offer offer1 = acService.createOffer(randomOres1, "TestSaveOneClickOrder 1");
Price price1 = new PriceImpl(new BigDecimal("20.00"), "CHF");
offer1.setPrice(price1);
offer1 = acService.save(offer1);
dbInstance.commitAndCloseSession();
//create a link offer to method
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(FreeAccessMethod.class);
assertNotNull(methods);
assertEquals(1, methods.size());
AccessMethod method = methods.get(0);
OfferAccess access1 = acMethodManager.createOfferAccess(offer1, method);
acMethodManager.save(access1);
dbInstance.commitAndCloseSession();
//one clicks
Order order = acOrderManager.saveOneClick(ident7, access1);
dbInstance.commitAndCloseSession();
//load order
Order retrivedOrder = acOrderManager.loadOrderByKey(order.getKey());
//check order
assertNotNull(retrivedOrder);
assertNotNull(retrivedOrder.getCreationDate());
assertNotNull(retrivedOrder.getDelivery());
assertNotNull(retrivedOrder.getOrderNr());
assertNotNull(retrivedOrder.getParts());
assertNotNull(retrivedOrder.getTotal());
assertNotNull(retrivedOrder.getTotalOrderLines());
assertEquals(ident7, retrivedOrder.getDelivery());
assertEquals(1, retrivedOrder.getParts().size());
assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), retrivedOrder.getTotalOrderLines().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
assertEquals(price1.getCurrencyCode(), retrivedOrder.getTotalOrderLines().getCurrencyCode());
assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), retrivedOrder.getTotal().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
assertEquals(price1.getCurrencyCode(), retrivedOrder.getTotal().getCurrencyCode());
//check order part
OrderPart orderPart = retrivedOrder.getParts().get(0);
assertNotNull(orderPart);
assertNotNull(orderPart.getTotal());
assertNotNull(orderPart.getTotalOrderLines());
assertEquals(1, orderPart.getOrderLines().size());
assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), orderPart.getTotalOrderLines().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
assertEquals(price1.getCurrencyCode(), orderPart.getTotalOrderLines().getCurrencyCode());
assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), orderPart.getTotal().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
assertEquals(price1.getCurrencyCode(), orderPart.getTotal().getCurrencyCode());
//check order line
OrderLine line = orderPart.getOrderLines().get(0);
Assert.assertNotNull(line);
Assert.assertNotNull(line.getOffer());
Assert.assertNotNull(line.getUnitPrice());
Assert.assertNotNull(line.getTotal());
Assert.assertEquals(offer1, line.getOffer());
Assert.assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), line.getUnitPrice().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
Assert.assertEquals(price1.getCurrencyCode(), line.getUnitPrice().getCurrencyCode());
Assert.assertEquals(price1.getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN), line.getTotal().getAmount().setScale(2, BigDecimal.ROUND_HALF_EVEN));
Assert.assertEquals(price1.getCurrencyCode(), line.getTotal().getCurrencyCode());
}
@Test
public void testLoadBy() {
//create some offers to buy
OLATResource randomOres1 = createResource();
Offer offer1 = acService.createOffer(randomOres1, "TestLoadBy 1");
offer1 = acService.save(offer1);
OLATResource randomOres2 = createResource();
Offer offer2 = acService.createOffer(randomOres2, "TestLoadBy 2");
offer2 = acService.save(offer2);
dbInstance.commitAndCloseSession();
//create a link offer to method
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(TokenAccessMethod.class);
assertNotNull(methods);
assertEquals(1, methods.size());
AccessMethod method = methods.get(0);
OfferAccess access1 = acMethodManager.createOfferAccess(offer1, method);
acMethodManager.save(access1);
OfferAccess access2 = acMethodManager.createOfferAccess(offer2, method);
acMethodManager.save(access2);
dbInstance.commitAndCloseSession();
//one clicks
Order order1 = acOrderManager.saveOneClick(ident4, access1);
Order order2 = acOrderManager.saveOneClick(ident5, access2);
Order order3_1 = acOrderManager.saveOneClick(ident6, access1);
Order order3_2 = acOrderManager.saveOneClick(ident6, access2);
dbInstance.commitAndCloseSession();
//load by delivery: ident 1
List<Order> retrivedOrder1 = acOrderManager.findOrdersByDelivery(ident4);
assertNotNull(retrivedOrder1);
assertEquals(1, retrivedOrder1.size());
assertEquals(order1, retrivedOrder1.get(0));
//load by delivery: ident 2
List<Order> retrievedOrder2 = acOrderManager.findOrdersByDelivery(ident5);
assertNotNull(retrievedOrder2);
assertEquals(1, retrievedOrder2.size());
assertEquals(order2, retrievedOrder2.get(0));
//load by delivery: ident 3
List<Order> retrievedOrder3 = acOrderManager.findOrdersByDelivery(ident6);
assertNotNull(retrievedOrder3);
assertEquals(2, retrievedOrder3.size());
assertTrue(order3_1.equals(retrievedOrder3.get(0)) || order3_1.equals(retrievedOrder3.get(1)));
assertTrue(order3_2.equals(retrievedOrder3.get(0)) || order3_2.equals(retrievedOrder3.get(1)));
dbInstance.commitAndCloseSession();
//load by resource: ores 1
List<Order> retrievedOrderOres1 = acOrderManager.findOrdersByResource(randomOres1);
assertNotNull(retrievedOrderOres1);
assertEquals(2, retrievedOrderOres1.size());
assertTrue(order1.equals(retrievedOrderOres1.get(0)) || order1.equals(retrievedOrderOres1.get(1)));
assertTrue(order3_1.equals(retrievedOrderOres1.get(0)) || order3_1.equals(retrievedOrderOres1.get(1)));
//load by resource: ores 2
List<Order> retrievedOrderOres2 = acOrderManager.findOrdersByResource(randomOres2);
assertNotNull(retrievedOrderOres2);
assertEquals(2, retrievedOrderOres2.size());
assertTrue(order2.equals(retrievedOrderOres2.get(0)) || order2.equals(retrievedOrderOres2.get(1)));
assertTrue(order3_2.equals(retrievedOrderOres2.get(0)) || order3_2.equals(retrievedOrderOres2.get(1)));
dbInstance.commitAndCloseSession();
}
@Test
public void testDeleteResource() {
//create some offers to buy
OLATResource randomOres1 = createResource();
Offer offer1 = acService.createOffer(randomOres1, "TestDeleteResource 1");
offer1 = acService.save(offer1);
dbInstance.commitAndCloseSession();
//create a link offer to method
List<AccessMethod> methods = acMethodManager.getAvailableMethodsByType(TokenAccessMethod.class);
assertNotNull(methods);
assertEquals(1, methods.size());
AccessMethod method = methods.get(0);
OfferAccess access = acMethodManager.createOfferAccess(offer1, method);
acMethodManager.save(access);
dbInstance.commitAndCloseSession();
//save an order
Order order1 = acOrderManager.saveOneClick(ident8, access);
dbInstance.commitAndCloseSession();
//delete the resource
randomOres1 = dbInstance.loadObject(OLATResourceImpl.class, randomOres1.getKey());
dbInstance.deleteObject(randomOres1);
dbInstance.commitAndCloseSession();
//load order
Order retrievedOrder1 = acOrderManager.loadOrderByKey(order1.getKey());
assertNotNull(retrievedOrder1);
}
private OLATResource createResource() {
//create a repository entry
OLATResourceable resourceable = new TypedResourceable(UUID.randomUUID().toString().replace("-", ""));
OLATResource r = resourceManager.createOLATResourceInstance(resourceable);
dbInstance.saveObject(r);
return r;
}
}