/* Licensed 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.camunda.bpm.model.bpmn;
import org.camunda.bpm.model.bpmn.instance.*;
import org.camunda.bpm.model.bpmn.instance.Process;
import org.camunda.bpm.model.bpmn.util.BpmnModelResource;
import org.junit.Before;
import org.junit.Test;
import java.util.Collection;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author Sebastian Menski
*
*/
public class ReferenceTest extends BpmnModelTest {
private BpmnModelInstance testBpmnModelInstance;
private Message message;
private MessageEventDefinition messageEventDefinition;
private StartEvent startEvent;
@Before
public void createModel() {
testBpmnModelInstance = Bpmn.createEmptyModel();
Definitions definitions = testBpmnModelInstance.newInstance(Definitions.class);
testBpmnModelInstance.setDefinitions(definitions);
message = testBpmnModelInstance.newInstance(Message.class);
message.setId("message-id");
definitions.getRootElements().add(message);
Process process = testBpmnModelInstance.newInstance(Process.class);
process.setId("process-id");
definitions.getRootElements().add(process);
startEvent = testBpmnModelInstance.newInstance(StartEvent.class);
startEvent.setId("start-event-id");
process.getFlowElements().add(startEvent);
messageEventDefinition = testBpmnModelInstance.newInstance(MessageEventDefinition.class);
messageEventDefinition.setId("msg-def-id");
messageEventDefinition.setMessage(message);
startEvent.getEventDefinitions().add(messageEventDefinition);
startEvent.getEventDefinitionRefs().add(messageEventDefinition);
}
@Test
public void testShouldUpdateReferenceOnIdChange() {
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
message.setId("changed-message-id");
assertThat(message.getId()).isEqualTo("changed-message-id");
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
message.setAttributeValue("id", "another-message-id", true);
assertThat(message.getId()).isEqualTo("another-message-id");
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
}
@Test
public void testShouldRemoveReferenceIfReferencingElementIsRemoved() {
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
Definitions definitions = testBpmnModelInstance.getDefinitions();
definitions.getRootElements().remove(message);
assertThat(messageEventDefinition.getId()).isEqualTo("msg-def-id");
assertThat(messageEventDefinition.getMessage()).isNull();
}
@Test
public void testShouldRemoveReferenceIfReferencingAttributeIsRemoved() {
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
message.removeAttribute("id");
assertThat(messageEventDefinition.getId()).isEqualTo("msg-def-id");
assertThat(messageEventDefinition.getMessage()).isNull();
}
@Test
public void testShouldUpdateReferenceIfReferencingElementIsReplaced() {
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
Message newMessage = testBpmnModelInstance.newInstance(Message.class);
newMessage.setId("new-message-id");
message.replaceWithElement(newMessage);
assertThat(messageEventDefinition.getMessage()).isEqualTo(newMessage);
}
@Test
public void testShouldAddMessageEventDefinitionRef() {
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).isNotEmpty();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
}
@Test
public void testShouldUpdateMessageEventDefinitionRefOnIdChange() {
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.setId("changed-message-event-definition-id");
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.setAttributeValue("id", "another-message-event-definition-id", true);
}
@Test
public void testShouldRemoveMessageEventDefinitionRefIfMessageEventDefinitionIsRemoved() {
startEvent.getEventDefinitions().remove(messageEventDefinition);
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
assertThat(eventDefinitionRefs).isEmpty();
}
@Test
public void testShouldReplaceMessageEventDefinitionRefIfMessageEventDefinitionIsReplaced() {
MessageEventDefinition otherMessageEventDefinition = testBpmnModelInstance.newInstance(MessageEventDefinition.class);
otherMessageEventDefinition.setId("other-message-event-definition-id");
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.replaceWithElement(otherMessageEventDefinition);
assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
assertThat(eventDefinitionRefs).contains(otherMessageEventDefinition);
}
@Test
public void testShouldRemoveMessageEventDefinitionRefIfIdIsRemovedOfMessageEventDefinition() {
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.removeAttribute("id");
assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
assertThat(eventDefinitionRefs).isEmpty();
}
@Test
@BpmnModelResource
public void shouldFindReferenceWithNamespace() {
MessageEventDefinition messageEventDefinition = bpmnModelInstance.getModelElementById("message-event-definition");
Message message = bpmnModelInstance.getModelElementById("message-id");
assertThat(messageEventDefinition.getMessage()).isNotNull();
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
message.setId("changed-message");
assertThat(messageEventDefinition.getMessage()).isNotNull();
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
message.setAttributeValue("id", "again-changed-message", true);
assertThat(messageEventDefinition.getMessage()).isNotNull();
assertThat(messageEventDefinition.getMessage()).isEqualTo(message);
StartEvent startEvent = bpmnModelInstance.getModelElementById("start-event");
Collection<EventDefinition> eventDefinitionRefs = startEvent.getEventDefinitionRefs();
assertThat(eventDefinitionRefs).isNotEmpty();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.setId("changed-message-event");
assertThat(eventDefinitionRefs).isNotEmpty();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
messageEventDefinition.setAttributeValue("id", "again-changed-message-event", true);
assertThat(eventDefinitionRefs).isNotEmpty();
assertThat(eventDefinitionRefs).contains(messageEventDefinition);
message.removeAttribute("id");
assertThat(messageEventDefinition.getMessage()).isNull();
messageEventDefinition.removeAttribute("id");
assertThat(eventDefinitionRefs).doesNotContain(messageEventDefinition);
assertThat(eventDefinitionRefs).isEmpty();
}
}