package com.opengamma.web.position;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ws.rs.core.Response;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import org.threeten.bp.OffsetTime;
import com.google.common.collect.Maps;
import com.opengamma.id.UniqueId;
import com.opengamma.master.position.ManageablePosition;
import com.opengamma.master.position.ManageableTrade;
import com.opengamma.master.position.PositionDocument;
import com.opengamma.util.money.Currency;
import com.opengamma.util.test.TestGroup;
import com.opengamma.web.WebResourceTestUtils;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class CreateAndUpdateTradesWithAttributesTest extends AbstractWebPositionResourceTestCase {
private static final OffsetTime TRADE_TIME = OffsetTime.parse("19:04+02:00");
private static final LocalDate TRADE_DATE = LocalDate.parse("2011-12-10");
private static final BigDecimal TRADE_QUANTITY = BigDecimal.valueOf(80);
private static final OffsetTime PREMIUM_TIME = OffsetTime.parse("18:04+01:00");
private static final LocalDate PREMIUM_DATE = LocalDate.parse("2011-12-11");
private static final String COUNTER_PARTY = "BACS";
private static final double TRADE_PREMIUM = 40.0;
private static final Pattern s_urlPattern = Pattern.compile("^(/positions/)(MemPos~[0-9]+)$");
private Map<String, String> _dealAttributes;
private Map<String, String> _userAttributes;
private UniqueId _positionID;
@BeforeMethod
public void init() {
_positionID = addPosition();
_dealAttributes = Maps.newHashMap();
_dealAttributes.put("deal1", "value1");
_dealAttributes.put("deal2", "value2");
_userAttributes = Maps.newHashMap();
_userAttributes.put("user1", "value1");
_userAttributes.put("user2", "value2");
}
@Test
public void updateTradeWithAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithAttributes(_positionID);
}
@Test
public void createTradeWithAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithAttributes(UniqueId.parse(positionId));
}
private void assertTradeWithAttributes(UniqueId positionId) {
PositionDocument positionDocument = _positionMaster.get(positionId);
ManageableTrade trade = assertTrade(positionDocument);
Map<String, String> attributes = trade.getAttributes();
assertNotNull(attributes);
assertEquals(4, attributes.size());
assertDealAttributes(attributes);
assertUserAttributes(attributes);
}
@Test
public void updateTradeWithEmptyDealAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyDealAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyDealAttributes(_positionID);
}
@Test
public void createTradeWithEmptyDealAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyDealAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyDealAttributes(UniqueId.parse(positionId));
}
@Test
public void updateTradeWithNoDealAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoDealAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyDealAttributes(_positionID);
}
@Test
public void createTradeWithNoDealAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoDealAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyDealAttributes(UniqueId.parse(positionId));
}
private void assertTradeWithEmptyDealAttributes(UniqueId positionId) {
PositionDocument positionDocument = _positionMaster.get(positionId);
ManageableTrade trade = assertTrade(positionDocument);
Map<String, String> attributes = trade.getAttributes();
assertNotNull(attributes);
assertEquals(2, attributes.size());
assertUserAttributes(attributes);
}
@Test
public void updateTradeWithEmptyUserAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyUserAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyUserAttributes(_positionID);
}
@Test
public void createTradeWithEmptyUserAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyUserAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyUserAttributes(UniqueId.parse(positionId));
}
@Test
public void updateTradeWithNoUserAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoUserAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyUserAttributes(_positionID);
}
@Test
public void createTradeWithNoUserAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoUserAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyUserAttributes(UniqueId.parse(positionId));
}
private void assertTradeWithEmptyUserAttributes(UniqueId positionId) {
PositionDocument positionDocument = _positionMaster.get(positionId);
ManageableTrade trade = assertTrade(positionDocument);
Map<String, String> attributes = trade.getAttributes();
assertNotNull(attributes);
assertEquals(2, attributes.size());
assertDealAttributes(attributes);
}
private void assertUserAttributes(Map<String, String> attributes) {
for (Entry<String, String> attrEntry : _userAttributes.entrySet()) {
assertEquals(attrEntry.getValue(), attributes.get(attrEntry.getKey()));
}
}
private void assertDealAttributes(Map<String, String> attributes) {
for (Entry<String, String> attrEntry : _dealAttributes.entrySet()) {
assertEquals(attrEntry.getValue(), attributes.get(attrEntry.getKey()));
}
}
@Test
public void updateTradeWithEmptyAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyAttributes(_positionID);
}
@Test
public void createTradeWithEmptyAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithEmptyAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyAttributes(UniqueId.parse(positionId));
}
@Test
public void updateTradeWithNoAttributes() throws Exception {
WebPositionResource positionResource = _webPositionsResource.findPosition(_positionID.toString());
Response response = positionResource.putJSON(QUANTITY.toString(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoAttributes.txt").toString(), null, null);
assertNotNull(response);
assertEquals(200, response.getStatus());
assertTradeWithEmptyAttributes(_positionID);
}
@Test
public void createTradeWithNoAttributes() throws Exception {
Response response = _webPositionsResource.postJSON(QUANTITY.toString(), SEC_ID.getScheme().getName(), SEC_ID.getValue(),
WebResourceTestUtils.loadJson("com/opengamma/web/position/tradesWithNoAttributes.txt").toString(), null, null, null);
assertNotNull(response);
assertEquals(201, response.getStatus());
String actualURL = getActualURL(response);
Matcher matcher = s_urlPattern.matcher(actualURL);
assertTrue(matcher.matches());
String positionId = matcher.group(2);
assertTradeWithEmptyAttributes(UniqueId.parse(positionId));
}
private void assertTradeWithEmptyAttributes(UniqueId positionId) {
PositionDocument positionDocument = _positionMaster.get(positionId);
ManageableTrade trade = assertTrade(positionDocument);
assertTrue(trade.getAttributes().isEmpty());
}
private ManageableTrade assertTrade(PositionDocument positionDocument) {
assertNotNull(positionDocument);
ManageablePosition position = positionDocument.getPosition();
assertEquals(BigDecimal.valueOf(QUANTITY), position.getQuantity());
assertEquals(1, position.getTrades().size());
ManageableTrade trade = position.getTrades().iterator().next();
assertEquals(SECURITY_LINK, trade.getSecurityLink());
assertEquals(TRADE_PREMIUM, trade.getPremium());
assertEquals(COUNTER_PARTY, trade.getCounterpartyExternalId().getValue());
assertEquals(Currency.USD, trade.getPremiumCurrency());
assertEquals(PREMIUM_DATE, trade.getPremiumDate());
assertEquals(PREMIUM_TIME, trade.getPremiumTime());
assertEquals(TRADE_QUANTITY, trade.getQuantity());
assertEquals(TRADE_DATE, trade.getTradeDate());
assertEquals(TRADE_TIME, trade.getTradeTime());
return trade;
}
}