/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openengsb.ui.admin.ruleEditorPage;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collection;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.util.tester.FormTester;
import org.junit.Before;
import org.junit.Test;
import org.openengsb.core.workflow.api.RuleBaseException;
import org.openengsb.core.workflow.api.model.RuleBaseElementId;
import org.openengsb.core.workflow.api.model.RuleBaseElementType;
import org.openengsb.ui.admin.AbstractUITest;
import org.openengsb.ui.admin.ruleEditorPanel.RuleEditorPanel;
public class RuleEditorTest extends AbstractUITest {
private RuleBaseElementId ruleBaseElementId;
@Before
public void init() throws RuleBaseException {
ruleBaseElementId = new RuleBaseElementId(RuleBaseElementType.Rule, "org.opentest", "test1");
Collection<RuleBaseElementId> rules = Arrays
.asList(ruleBaseElementId, new RuleBaseElementId(RuleBaseElementType.Rule, "org.opentest", "test2"));
when(ruleManager.listAll(RuleBaseElementType.Rule)).thenReturn(rules);
when(ruleManager.get(ruleBaseElementId)).thenReturn("testsource");
tester.startPage(RuleEditorPage.class);
verify(ruleManager).listAll(RuleBaseElementType.Rule);
}
@Test
@SuppressWarnings("unchecked")
public void testRenderEditorPage_shouldShowPage() throws Exception {
tester.assertRenderedPage(RuleEditorPage.class);
tester.assertComponent("ruleEditor", RuleEditorPanel.class);
tester.assertComponent("ruleEditor:form", Form.class);
tester.assertComponent("ruleEditor:form:typeChoice", DropDownChoice.class);
tester.assertComponent("ruleEditor:form:ruleChoice", DropDownChoice.class);
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:ruleChoice").isVisible());
tester.assertComponent("ruleEditor:form:save", AjaxButton.class);
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
tester.assertComponent("ruleEditor:form:cancel", AjaxButton.class);
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
tester.assertComponent("ruleEditor:form:new", AjaxButton.class);
tester.assertComponent("ruleEditor:form:text", TextArea.class);
DropDownChoice<RuleBaseElementId> typeDropDown = (DropDownChoice<RuleBaseElementId>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:typeChoice");
assertEquals(RuleBaseElementType.Rule, typeDropDown.getModelObject());
tester.assertComponent("ruleEditor:form:ruleChoice", DropDownChoice.class);
DropDownChoice<RuleBaseElementId> ruleDropDown = (DropDownChoice<RuleBaseElementId>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:ruleChoice");
assertNotNull(ruleDropDown.getModel());
assertThat(ruleDropDown.getModelObject(), nullValue());
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertFalse(textArea.isEnabled());
}
@Test
@SuppressWarnings("unchecked")
public void testChangeSelectedRule_shouldSelectRule() throws Exception {
FormTester formTester = tester.newFormTester("ruleEditor:form");
formTester.select("ruleChoice", 0);
tester.executeAjaxEvent("ruleEditor:form:ruleChoice", "onchange");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("testsource", textArea.getModelObject());
}
@Test
@SuppressWarnings("unchecked")
public void testChangeSelectedRuleType_shouldChangeRuleType() throws Exception {
FormTester formTester = tester.newFormTester("ruleEditor:form");
formTester.select("typeChoice", 1);
tester.executeAjaxEvent("ruleEditor:form:typeChoice", "onchange");
DropDownChoice<RuleBaseElementId> typeDropDown = (DropDownChoice<RuleBaseElementId>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:typeChoice");
assertEquals(RuleBaseElementType.Function, typeDropDown.getModelObject());
DropDownChoice<RuleBaseElementId> ruleDropDown = (DropDownChoice<RuleBaseElementId>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:ruleChoice");
assertNotNull(ruleDropDown.getModel());
assertThat(ruleDropDown.getModelObject(), nullValue());
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertFalse(textArea.isEnabled());
assertNotNull(textArea.getModel());
assertEquals(null, textArea.getModelObject());
verify(ruleManager).listAll(RuleBaseElementType.Rule);
verify(ruleManager).listAll(RuleBaseElementType.Function);
}
@SuppressWarnings("unchecked")
private void enterText() {
FormTester formTester = tester.newFormTester("ruleEditor:form");
formTester.select("ruleChoice", 0);
tester.executeAjaxEvent("ruleEditor:form:ruleChoice", "onchange");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("testsource", textArea.getModelObject());
formTester.setValue("text", "modified source");
tester.executeAjaxEvent(textArea, "onchange");
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
}
@Test
@SuppressWarnings("unchecked")
public void testSubmitChanges_shouldSaveChanges() throws Exception {
enterText();
tester.executeAjaxEvent("ruleEditor:form:save", "onclick");
verify(ruleManager).update(ruleBaseElementId, "modified source");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("modified source", textArea.getModelObject());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
}
@Test
@SuppressWarnings("unchecked")
public void testClickCancelButton_shouldCancelAction() throws Exception {
enterText();
tester.executeAjaxEvent("ruleEditor:form:cancel", "onclick");
verify(ruleManager, times(2)).get(ruleBaseElementId);
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("testsource", textArea.getModelObject());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
}
@Test
@SuppressWarnings("unchecked")
public void testSubmitChangesWithErrors_shouldShowError() throws Exception {
doThrow(new RuleBaseException("error")).when(ruleManager).update((RuleBaseElementId) anyObject(), anyString());
enterText();
tester.executeAjaxEvent("ruleEditor:form:save", "onclick");
verify(ruleManager, times(1)).update(ruleBaseElementId, "modified source");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("modified source", textArea.getModelObject());
tester.assertErrorMessages(new String[]{ "error" });
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
tester.assertComponent("ruleEditor:feedback", FeedbackPanel.class);
FeedbackPanel feedbackPanel = (FeedbackPanel) tester.getComponentFromLastRenderedPage("ruleEditor:feedback");
assertTrue(feedbackPanel.isVisible());
}
@Test
@SuppressWarnings("unchecked")
public void testButtonStateOnSecondChange_shouldBeDisabled() throws Exception {
enterText();
FormTester formTester = tester.newFormTester("ruleEditor:form");
formTester.select("ruleChoice", 0);
tester.executeAjaxEvent("ruleEditor:form:ruleChoice", "onchange");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("testsource", textArea.getModelObject());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
}
@Test
@SuppressWarnings("unchecked")
public void testCreateNewRule_shouldAddRule() throws Exception {
tester.executeAjaxEvent("ruleEditor:form:new", "onclick");
TextField<String> rulename = (TextField<String>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:ruleName");
assertEquals("rulename", rulename.getModelObject());
assertTrue(rulename.isVisible());
FormTester formTester = tester.newFormTester("ruleEditor:form");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("", textArea.getModelObject());
formTester.setValue("text", "new rule source");
tester.executeAjaxEvent(textArea, "onchange");
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:new").isEnabled());
tester.executeAjaxEvent("ruleEditor:form:save", "onclick");
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:new").isEnabled());
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:ruleChoice").isVisible());
tester.assertComponent("ruleEditor:form:ruleChoice", DropDownChoice.class);
assertEquals(RuleBaseElementType.Rule, ((DropDownChoice<RuleBaseElementType>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:typeChoice")).getDefaultModelObject());
RuleBaseElementId ruleBaseElementId = new RuleBaseElementId(RuleBaseElementType.Rule, "rulename");
verify(ruleManager).add(ruleBaseElementId, "new rule source");
verify(ruleManager, times(2)).listAll(RuleBaseElementType.Rule);
assertEquals(ruleBaseElementId,
tester.getComponentFromLastRenderedPage("ruleEditor:form:ruleChoice").getDefaultModelObject());
}
@Test
@SuppressWarnings("unchecked")
public void testSubmitNewWithErrors_shouldShowError() throws Exception {
doThrow(new RuleBaseException("error")).when(ruleManager).add((RuleBaseElementId) anyObject(), anyString());
tester.executeAjaxEvent("ruleEditor:form:new", "onclick");
TextField<String> rulename = (TextField<String>) tester
.getComponentFromLastRenderedPage("ruleEditor:form:ruleName");
assertEquals("rulename", rulename.getModelObject());
assertTrue(rulename.isVisible());
FormTester formTester = tester.newFormTester("ruleEditor:form");
TextArea<String> textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("", textArea.getModelObject());
formTester.setValue("text", "new rule source");
tester.executeAjaxEvent(textArea, "onchange");
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
assertTrue(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:new").isEnabled());
tester.executeAjaxEvent("ruleEditor:form:save", "onclick");
verify(ruleManager, times(1))
.add(new RuleBaseElementId(RuleBaseElementType.Rule, "rulename"), "new rule source");
textArea = (TextArea<String>) tester.getComponentFromLastRenderedPage("ruleEditor:form:text");
assertTrue(textArea.isEnabled());
assertEquals("new rule source", textArea.getModelObject());
tester.assertErrorMessages(new String[]{ "error" });
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:cancel").isEnabled());
assertFalse(tester.getComponentFromLastRenderedPage("ruleEditor:form:save").isEnabled());
tester.assertComponent("ruleEditor:feedback", FeedbackPanel.class);
FeedbackPanel feedbackPanel = (FeedbackPanel) tester.getComponentFromLastRenderedPage("ruleEditor:feedback");
assertTrue(feedbackPanel.isVisible());
}
}