/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.security.impl;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertSame;
import java.util.Collections;
import java.util.List;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.opengamma.DataNotFoundException;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.id.ObjectIdSupplier;
import com.opengamma.id.UniqueId;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.master.security.SecurityDocument;
import com.opengamma.master.security.SecuritySearchRequest;
import com.opengamma.master.security.SecuritySearchResult;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.test.TestGroup;
/**
* Test {@link InMemorySecurityMaster}.
*/
@Test(groups = TestGroup.UNIT)
public class InMemorySecurityMasterTest {
// TODO Move the logical tests from here to the generic SecurityMasterTestCase then we can just extend from that
private static final UniqueId OTHER_UID = UniqueId.of("U", "1");
private static final ExternalId ID1 = ExternalId.of("A", "B");
private static final ExternalId ID2 = ExternalId.of("A", "C");
private static final ExternalIdBundle BUNDLE1 = ExternalIdBundle.of(ID1);
private static final ExternalIdBundle BUNDLE2 = ExternalIdBundle.of(ID2);
private static final ManageableSecurity SEC1 = new ManageableSecurity(UniqueId.of("Test", "sec1"), "Test 1", "TYPE1", BUNDLE1);
private static final ManageableSecurity SEC2 = new ManageableSecurity(UniqueId.of("Test", "sec2"), "Test 2", "TYPE2", BUNDLE2);
private InMemorySecurityMaster testEmpty;
private InMemorySecurityMaster testPopulated;
private SecurityDocument doc1;
private SecurityDocument doc2;
@BeforeMethod
public void setUp() {
testEmpty = new InMemorySecurityMaster(new ObjectIdSupplier("Test"));
testPopulated = new InMemorySecurityMaster(new ObjectIdSupplier("Test"));
doc1 = new SecurityDocument();
doc1.setSecurity(SEC1);
doc1 = testPopulated.add(doc1);
doc2 = new SecurityDocument();
doc2.setSecurity(SEC2);
doc2 = testPopulated.add(doc2);
}
//-------------------------------------------------------------------------
@Test(expectedExceptions = IllegalArgumentException.class)
public void test_constructor_nullSupplier() {
new InMemorySecurityMaster((Supplier<ObjectId>) null);
}
public void test_defaultSupplier() {
InMemorySecurityMaster master = new InMemorySecurityMaster();
SecurityDocument doc = new SecurityDocument();
doc.setSecurity(SEC1);
SecurityDocument added = master.add(doc);
assertEquals("MemSec", added.getUniqueId().getScheme());
}
public void test_alternateSupplier() {
InMemorySecurityMaster master = new InMemorySecurityMaster(new ObjectIdSupplier("Hello"));
SecurityDocument doc = new SecurityDocument();
doc.setSecurity(SEC1);
SecurityDocument added = master.add(doc);
assertEquals("Hello", added.getUniqueId().getScheme());
}
//-------------------------------------------------------------------------
public void test_search_emptyMaster() {
SecuritySearchRequest request = new SecuritySearchRequest();
SecuritySearchResult result = testEmpty.search(request);
assertEquals(0, result.getPaging().getTotalItems());
assertEquals(0, result.getDocuments().size());
}
public void test_search_populatedMaster_all() {
SecuritySearchRequest request = new SecuritySearchRequest();
SecuritySearchResult result = testPopulated.search(request);
assertEquals(2, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(2, docs.size());
assertEquals(true, docs.contains(doc1));
assertEquals(true, docs.contains(doc2));
}
public void test_search_populatedMaster_filterByBundle() {
SecuritySearchRequest request = new SecuritySearchRequest(BUNDLE1);
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
assertEquals(1, result.getDocuments().size());
assertEquals(true, result.getDocuments().contains(doc1));
}
public void test_search_populatedMaster_filterByBundle_both() {
SecuritySearchRequest request = new SecuritySearchRequest();
request.addExternalIds(BUNDLE1);
request.addExternalIds(BUNDLE2);
SecuritySearchResult result = testPopulated.search(request);
assertEquals(2, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(2, docs.size());
assertEquals(true, docs.contains(doc1));
assertEquals(true, docs.contains(doc2));
}
public void test_search_populatedMaster_filterByName() {
SecuritySearchRequest request = new SecuritySearchRequest();
request.setName("*est 2");
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(1, docs.size());
assertEquals(true, docs.contains(doc2));
}
public void test_search_populatedMaster_filterByType() {
SecuritySearchRequest request = new SecuritySearchRequest();
request.setSecurityType("TYPE2");
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(1, docs.size());
assertEquals(true, docs.contains(doc2));
}
public void test_search_popluatedMaster_filterByExternalIdValue() {
SecuritySearchRequest request = new SecuritySearchRequest();
request.setExternalIdValue("B");
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(1, docs.size());
assertEquals(true, docs.contains(doc1));
}
public void test_search_popluatedMaster_filterByExternalIdValue_case() {
SecuritySearchRequest request = new SecuritySearchRequest();
request.setExternalIdValue("b");
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(1, docs.size());
assertEquals(true, docs.contains(doc1));
}
//-------------------------------------------------------------------------
@Test(expectedExceptions = DataNotFoundException.class)
public void test_get_emptyMaster() {
assertNull(testEmpty.get(OTHER_UID));
}
public void test_get_populatedMaster() {
assertSame(doc1, testPopulated.get(doc1.getUniqueId()));
assertSame(doc2, testPopulated.get(doc2.getUniqueId()));
}
//-------------------------------------------------------------------------
public void test_add_emptyMaster() {
SecurityDocument doc = new SecurityDocument();
doc.setSecurity(SEC1);
SecurityDocument added = testEmpty.add(doc);
assertNotNull(added.getVersionFromInstant());
assertNotNull(added.getCorrectionFromInstant());
assertEquals(added.getVersionFromInstant(), added.getCorrectionFromInstant());
assertEquals("Test", added.getUniqueId().getScheme());
assertSame(SEC1, added.getSecurity());
}
//-------------------------------------------------------------------------
@Test(expectedExceptions = DataNotFoundException.class)
public void test_update_emptyMaster() {
SecurityDocument doc = new SecurityDocument();
doc.setSecurity(SEC1);
doc.setUniqueId(OTHER_UID);
testEmpty.update(doc);
}
public void test_update_populatedMaster() {
SecurityDocument doc = new SecurityDocument();
doc.setSecurity(SEC1);
doc.setUniqueId(doc1.getUniqueId());
SecurityDocument updated = testPopulated.update(doc);
assertEquals(doc1.getUniqueId(), updated.getUniqueId());
assertNotNull(doc1.getVersionFromInstant());
assertNotNull(updated.getVersionFromInstant());
}
//-------------------------------------------------------------------------
@Test(expectedExceptions = DataNotFoundException.class)
public void test_remove_emptyMaster() {
testEmpty.remove(OTHER_UID);
}
public void test_remove_populatedMaster() {
testPopulated.remove(doc1.getUniqueId());
SecuritySearchRequest request = new SecuritySearchRequest();
SecuritySearchResult result = testPopulated.search(request);
assertEquals(1, result.getPaging().getTotalItems());
List<SecurityDocument> docs = result.getDocuments();
assertEquals(1, docs.size());
assertEquals(true, docs.contains(doc2));
}
public void test_replace_adds_uniqueid() {
// remove UniqueId() from updated doc, search will use ExternalId and UniqueId of replaced version returned
ManageableSecurity withoutId = SEC1.clone();
withoutId.setUniqueId(null);
SecurityDocument tempDoc = new SecurityDocument();
tempDoc.setSecurity(withoutId);
List<UniqueId> ids = testPopulated.replaceAllVersions(SEC1.getUniqueId().getObjectId(), Collections.singletonList(tempDoc));
ArgumentChecker.noNulls(ids, "ids");
}
}