package net.codjo.control.gui.plugin;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JInternalFrame;
import net.codjo.agent.AgentContainerMock;
import net.codjo.agent.UserId;
import net.codjo.agent.test.Semaphore;
import net.codjo.control.common.message.TransferJobRequest.Transfer;
import net.codjo.control.gui.ControlGuiContext;
import net.codjo.control.gui.data.QuarantineGuiData;
import net.codjo.control.gui.util.QuarantineUtil;
import net.codjo.i18n.common.Language;
import net.codjo.i18n.gui.TranslationNotifier;
import net.codjo.mad.client.plugin.MadConnectionOperations;
import net.codjo.mad.client.request.Field;
import net.codjo.mad.client.request.FieldsList;
import net.codjo.mad.client.request.MadServerFixture;
import net.codjo.mad.client.request.Request;
import net.codjo.mad.client.request.RequestException;
import net.codjo.mad.client.request.RequestIdManager;
import net.codjo.mad.client.request.Result;
import net.codjo.mad.client.request.ResultManager;
import net.codjo.mad.client.request.Row;
import net.codjo.mad.client.request.SelectRequest;
import net.codjo.mad.common.structure.DefaultStructureReader;
import net.codjo.mad.common.structure.StructureReader;
import net.codjo.mad.gui.base.GuiPlugin;
import net.codjo.mad.gui.framework.GuiContext;
import net.codjo.mad.gui.framework.Sender;
import net.codjo.mad.gui.request.ListDataSource;
import net.codjo.mad.gui.request.Mock;
import net.codjo.mad.gui.request.PreferenceFactory;
import net.codjo.mad.gui.request.RequestComboBox;
import net.codjo.mad.gui.request.RequestTable;
import net.codjo.mad.gui.request.factory.SelectFactory;
import net.codjo.security.common.api.UserMock;
import net.codjo.test.common.LogString;
import org.uispec4j.ComboBox;
import org.uispec4j.Trigger;
import org.uispec4j.UISpecTestCase;
import org.uispec4j.Window;
import org.xml.sax.InputSource;
import static net.codjo.mad.gui.i18n.InternationalizationUtil.retrieveTranslationNotifier;
public class DefaultQuarantineWindowTest extends UISpecTestCase {
private static final String PREFERENCES =
"<?xml version=\"1.0\"?> "
+ "<preferenceList> "
+ "<preference id=\"QUserIssuerWindow\"> "
+ " <selectAll>selectAllQUserDecisivEntry</selectAll> "
+ " <update>updateQUserDecisivEntry</update> "
+ " <column fieldName=\"issuerCode\" label=\"Issuer Code\"/> "
+ " <column fieldName=\"user\" label=\"User\"/> "
+ " <column fieldName=\"source\" label=\"Source\"/> "
+ "</preference> "
+ "</preferenceList> ";
private Window window;
private RequestComboBox issuerCodeCombo;
private RequestComboBox userCombo;
private RequestComboBox sourceCombo;
private LogString log = new LogString();
private Semaphore sendRequestSemaphore = new Semaphore();
private Semaphore loadSemaphore = new Semaphore();
private QuarantineManager manager;
private ControlGuiContext guiContext;
private UserId userId;
private TranslationNotifier translationNotifier;
@Override
protected void setUp() throws Exception {
super.setUp();
userId = UserId.createId("login", "pwd");
manager = new QuarantineManager(QuarantineManager.class.getResource("QuarantineGuiTest.xml"), userId);
PreferenceFactory.loadMapping(new InputSource(new StringReader(PREFERENCES)));
guiContext = new ControlGuiContext();
translationNotifier = retrieveTranslationNotifier(guiContext);
guiContext.setSender(new Sender(new MadOperationsMock()));
guiContext.putProperty(GuiPlugin.AGENT_CONTAINER_KEY, new AgentContainerMock(new LogString()));
UserMock userMock = new UserMock();
userMock.mockIsAllowedTo(true);
guiContext.setUser(userMock);
initWindow(3);
RequestIdManager.getInstance().reset();
}
public void test_windowPreferredSize() throws Exception {
assertEquals("Liste quarantaine des emetteurs",
((JInternalFrame)window.getAwtComponent()).getTitle());
assertEquals(800.0, window.getAwtComponent().getPreferredSize().getWidth());
assertEquals(480.0, window.getAwtComponent().getPreferredSize().getHeight());
initWindow(2);
assertEquals("Liste quarantaine des emetteurs avec taille customis�e",
((JInternalFrame)window.getAwtComponent()).getTitle());
assertEquals(500.0, window.getAwtComponent().getPreferredSize().getWidth());
assertEquals(300.0, window.getAwtComponent().getPreferredSize().getHeight());
}
public void test_dbFilters_constructor() throws Exception {
assertTrue(window.containsSwingComponent(RequestComboBox.class, "DbFilter.user"));
assertTrue(window.containsSwingComponent(RequestComboBox.class, "DbFilter.source"));
assertEquals("selectAllQuarantineValuesForFieldName",
userCombo.getDataSource().getLoadFactory().getId());
assertEquals("selectAllQuarantineValuesForFieldName",
sourceCombo.getDataSource().getLoadFactory().getId());
}
public void test_dbFilters_loadOnInit() throws Exception {
log.assertContent(
"filter combo : data source loaded(), filter combo : data source loaded(), filter combo : data source loaded(), filters loaded()");
assertEquals("Tout", userCombo.getDataSource().getSelectedRow().getFieldValue("value"));
assertEquals("Tout", sourceCombo.getDataSource().getSelectedRow().getFieldValue("value"));
}
public void test_dbFilters_reloadOnTableLoad() throws Exception {
MadServerFixture madServerFixture = new MadServerFixture();
madServerFixture.doSetUp();
guiContext.setSender(new Sender(madServerFixture.getOperations()));
initWindow(2, new ListDataSource());
madServerFixture.mockServerResult(createSelectResult());
log.clear();
RequestTable requestTable = (RequestTable)window.getTable().getJTable();
requestTable.load();
log.assertContent(
"filter combo : data source loaded(), filter combo : data source loaded(), filter combo : data source loaded(), filters loaded()");
madServerFixture.doTearDown();
}
public void test_dbFilters_selectorUpdate() throws Exception {
ComboBox testUserCombo = new ComboBox(userCombo);
testUserCombo.select("joe bloggs 2");
assertTrue(testUserCombo.contentEquals(new String[]{"Tout", "joe bloggs", "joe bloggs 2"}));
translationNotifier.setLanguage(Language.EN);
assertTrue(testUserCombo.contentEquals(new String[]{"All", "joe bloggs", "joe bloggs 2"}));
RequestTable requestTable = (RequestTable)window.getTable().getJTable();
ListDataSource dataSource = requestTable.getDataSource();
FieldsList fieldsList = dataSource.getSelector();
assertEquals("joe bloggs 2", fieldsList.getFieldValue("user"));
assertEquals("Tout", fieldsList.getFieldValue("source"));
testUserCombo = new ComboBox(sourceCombo);
testUserCombo.select("testRenderer 1");
fieldsList = dataSource.getSelector();
assertEquals("joe bloggs 2", fieldsList.getFieldValue("user"));
assertEquals("source 1", fieldsList.getFieldValue("source"));
}
public void test_dbFilters_loadTableWhenValueChanged() throws Exception {
clearLog();
ComboBox testUserCombo = new ComboBox(userCombo);
testUserCombo.select("joe bloggs 2");
assertLog();
}
public void test_dbFilters_sorting() throws Exception {
QuarantineGuiData guiData = (QuarantineGuiData)manager.getList().getDataList().toArray()[3];
window = new Window(new DefaultQuarantineWindowMockWithRealComboDataSources(guiContext, guiData, userId));
issuerCodeCombo = (RequestComboBox)window.getComboBox("DbFilter.issuerCode").getAwtComponent();
checkSorterInSelector("ascending", issuerCodeCombo.getDataSource());
sourceCombo = (RequestComboBox)window.getComboBox("DbFilter.source").getAwtComponent();
checkSorterInSelector("descending", sourceCombo.getDataSource());
userCombo = (RequestComboBox)window.getComboBox("DbFilter.user").getAwtComponent();
checkSorterInSelector(null, userCombo.getDataSource());
}
public void test_groupingByOkButton() throws Exception {
assertGrouping(new Trigger() {
public void run() throws Exception {
window.getButton(QuarantineUtil.QUARANTINE_OK_BUTTON_NAME).click();
}
}, "0");
}
public void test_groupingByForceButton() throws Exception {
assertGrouping(new Trigger() {
public void run() throws Exception {
window.getButton(QuarantineUtil.QUARANTINE_FORCE_BUTTON_NAME).click();
}
}, "-1001");
}
public void test_groupIdIsOptional() throws Exception {
clearLog();
RequestTable requestTable = (RequestTable)window.getTable().getJTable();
ListDataSource dataSource = requestTable.getDataSource();
Result loadResult = MadServerFixture
.createResult(new String[]{
"quarantineId", "field1", "issuerCode", "user", "source", "errorType"},
new String[][]{{"0", "ligne1", "hello", "me", "myTest", "1001"},
{"1", "ligne2", "hello", "me", "myTest", "1001"},
});
loadResult.setPrimaryKey("field1");
dataSource.setLoadResult(loadResult);
window.getTable().selectRow(0);
window.getButton(QuarantineUtil.QUARANTINE_OK_BUTTON_NAME).click();
assertLog("<update request_id=\"1\">"
+ "<id>updateQUserDecisivEntry</id>"
+ "<primarykey><field name=\"field1\">ligne1</field></primarykey>"
+ "<row><field name=\"errorType\">0</field></row>"
+ "</update>");
}
private void checkSorterInSelector(String expected, ListDataSource dataSource) {
SelectFactory selectFactory = (SelectFactory)dataSource.getLoadFactory();
SelectRequest request = (SelectRequest)selectFactory.buildRequest(null);
FieldsList selector = request.getSelector();
assertEquals(expected, selector.getFieldValue("sorter"));
}
private void initWindow(final int windowIndex) throws Exception {
QuarantineGuiData guiData = (QuarantineGuiData)manager.getList().getDataList().toArray()[windowIndex];
window = new Window(new DefaultQuarantineWindowMock(guiContext, guiData, userId));
initDataSources(window);
}
private void initWindow(final int windowIndex, ListDataSource dataSource) throws Exception {
QuarantineGuiData guiData = (QuarantineGuiData)manager.getList().getDataList().toArray()[windowIndex];
window = new Window(new DefaultQuarantineWindowMock(guiContext, guiData, userId, dataSource));
initDataSources(window);
}
private void clearLog() {
log.clear();
loadSemaphore = new Semaphore();
}
private void assertLog(String... requests) {
sendRequestSemaphore.acquire(requests.length);
loadSemaphore.acquire(1);
StringBuilder expected = new StringBuilder();
for (String request : requests) {
expected.append("sendRequest(").append(request).append("), ");
}
expected.append("main table : data source loaded()");
log.assertContent(expected.toString());
}
private void assertGrouping(Trigger trigger, String expectedError) throws Exception {
clearLog();
RequestTable requestTable = (RequestTable)window.getTable().getJTable();
ListDataSource dataSource = requestTable.getDataSource();
Result loadResult = createSelectResult();
loadResult.setPrimaryKey("field1");
dataSource.setLoadResult(loadResult);
assertEquals(5, dataSource.getRowCount());
window.getTable().selectRows(new int[]{1, 4});
trigger.run();
assertLog("<update request_id=\"1\">"
+ "<id>updateQUserDecisivEntry</id>"
+ "<primarykey><field name=\"field1\">ligne1</field></primarykey>"
+ "<row><field name=\"errorType\">" + expectedError + "</field></row>"
+ "</update>",
"<update request_id=\"2\">"
+ "<id>updateQUserDecisivEntry</id>"
+ "<primarykey><field name=\"field1\">ligne2</field></primarykey>"
+ "<row><field name=\"errorType\">" + expectedError + "</field></row>"
+ "</update>",
"<update request_id=\"3\">"
+ "<id>updateQUserDecisivEntry</id>"
+ "<primarykey><field name=\"field1\">ligne5</field></primarykey>"
+ "<row><field name=\"errorType\">" + expectedError + "</field></row>"
+ "</update>");
clearLog();
window.getTable().selectRow(3);
trigger.run();
assertLog("<update request_id=\"4\">"
+ "<id>updateQUserDecisivEntry</id>"
+ "<primarykey><field name=\"field1\">ligne4</field></primarykey>"
+ "<row><field name=\"errorType\">" + expectedError + "</field></row>"
+ "</update>");
}
private Result createSelectResult() {
return MadServerFixture
.createResult(new String[]{
"quarantineId", "field1", "issuerCode", "groupId", "user", "source", "errorType"},
new String[][]{{"0", "ligne1", "hello", "1", "me", "myTest", "1001"},
{"1", "ligne2", "hello", "1", "me", "myTest", "1001"},
{"2", "ligne3", "hello", "2", "me", "myTest", "1001"},
{"3", "ligne4", "hello", "null", "me", "myTest", "1001"},
{"4", "ligne5", "hello", "3", "me", "myTest", "1001"},
});
}
private void initDataSources(Window aWindow) {
issuerCodeCombo = (RequestComboBox)aWindow.getComboBox("DbFilter.issuerCode").getAwtComponent();
ListDataSource issuerCodeDataSource = issuerCodeCombo.getDataSource();
issuerCodeDataSource.addRow(createRow("value", "code2"));
issuerCodeDataSource.addRow(createRow("value", "code0"));
issuerCodeDataSource.addRow(createRow("value", "code1"));
userCombo = (RequestComboBox)aWindow.getComboBox("DbFilter.user").getAwtComponent();
ListDataSource userDataSource = userCombo.getDataSource();
userDataSource.addRow(createRow("value", "joe bloggs"));
userDataSource.addRow(createRow("value", "joe bloggs 2"));
sourceCombo = (RequestComboBox)aWindow.getComboBox("DbFilter.source").getAwtComponent();
ListDataSource sourceDataSource = sourceCombo.getDataSource();
sourceDataSource.addRow(createRow("value", "source 1"));
sourceDataSource.addRow(createRow("value", "source 2"));
}
private Row createRow(String fieldName, String value) {
Row row = new Row();
List<Field> fields = new ArrayList<Field>();
fields.add(new Field(fieldName, value));
row.setFields(fields);
return row;
}
private class MadOperationsMock implements MadConnectionOperations {
public Result sendRequest(Request request) throws RequestException {
log.call("sendRequest", request.toXml());
sendRequestSemaphore.release();
return new Result();
}
public Result sendRequest(Request request, long timeout) throws RequestException {
log.call("sendRequest", request.toXml());
return new Result();
}
public ResultManager sendRequests(Request[] request) throws RequestException {
StringBuilder requests = new StringBuilder();
for (Request aRequest : request) {
log.call("sendRequests", requests.append(aRequest.toXml()));
}
return null;
}
public ResultManager sendRequests(Request[] request, long timeout) throws RequestException {
StringBuilder requests = new StringBuilder();
for (Request aRequest : request) {
log.call("sendRequests", requests.append(aRequest.toXml()));
}
return null;
}
}
private class DefaultQuarantineWindowMock extends DefaultQuarantineWindow {
DefaultQuarantineWindowMock(GuiContext rootCtxt, QuarantineGuiData gui,
UserId userId, ListDataSource listDataSource) throws Exception {
super(rootCtxt, gui, userId, listDataSource);
allFieldsSelector.addField("issuerCode", "Tout");
allFieldsSelector.addField("user", "Tout");
allFieldsSelector.addField("source", "Tout");
loadFilters();
}
DefaultQuarantineWindowMock(GuiContext rootCtxt, QuarantineGuiData gui, UserId userId) throws Exception {
super(rootCtxt, gui, userId, new MockDataSource("main table", log));
allFieldsSelector.addField("issuerCode", "Tout");
allFieldsSelector.addField("user", "Tout");
allFieldsSelector.addField("source", "Tout");
loadFilters();
}
@Override
protected void initQuarantineLoad() {
guiContext.executeTask(new QuarantineRunnable(Transfer.QUARANTINE_TO_USER, QUARANTINE_TO_USER));
}
@Override
void loadFilters() {
super.loadFilters();
log.call("filters loaded");
}
@Override
protected ListDataSource getFilterDataSource() {
return new MockDataSource("filter combo", log);
}
@Override
protected StructureReader getStructureReader(GuiContext localGuiCtxt) {
try {
return new DefaultStructureReader(getClass().getResourceAsStream("StructureDef.xml"));
}
catch (Exception e) {
fail("Exception inattendue");
}
return null;
}
}
private class DefaultQuarantineWindowMockWithRealComboDataSources extends DefaultQuarantineWindow {
DefaultQuarantineWindowMockWithRealComboDataSources(GuiContext rootCtxt, QuarantineGuiData gui,
UserId userId, ListDataSource listDataSource)
throws Exception {
super(rootCtxt, gui, userId, listDataSource);
allFieldsSelector.addField("issuerCode", "Tout");
allFieldsSelector.addField("user", "Tout");
allFieldsSelector.addField("source", "Tout");
}
DefaultQuarantineWindowMockWithRealComboDataSources(GuiContext rootCtxt, QuarantineGuiData gui, UserId userId)
throws Exception {
super(rootCtxt, gui, userId, new MockDataSource("main table", log));
allFieldsSelector.addField("issuerCode", "Tout");
allFieldsSelector.addField("user", "Tout");
allFieldsSelector.addField("source", "Tout");
}
@Override
protected void initQuarantineLoad() {
guiContext.executeTask(new QuarantineRunnable(Transfer.QUARANTINE_TO_USER, QUARANTINE_TO_USER));
}
@Override
void loadFilters() {
super.loadFilters();
log.call("filters loaded");
}
@Override
protected StructureReader getStructureReader(GuiContext localGuiCtxt) {
try {
return new DefaultStructureReader(getClass().getResourceAsStream("StructureDef.xml"));
}
catch (Exception e) {
fail("Exception inattendue");
}
return null;
}
}
private class MockDataSource extends Mock.ListDataSource {
private LogString log;
private String prefix;
MockDataSource(String prefix, LogString log) {
this.prefix = prefix;
this.log = log;
}
@Override
public void load() throws RequestException {
log.call(prefix + " : data source loaded");
loadSemaphore.release();
}
}
}