From 704adae7e1051de2ad4890b86026ce7843c453e7 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Tue, 17 Nov 2020 14:50:40 +0100
Subject: [PATCH] More tests

---
 tests/test_state.py | 53 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 51 insertions(+), 2 deletions(-)

diff --git a/tests/test_state.py b/tests/test_state.py
index 6a7f707..ab73407 100644
--- a/tests/test_state.py
+++ b/tests/test_state.py
@@ -19,11 +19,16 @@ def setup_module():
     db.Record("State1").add_parent("State").insert()
     db.Record("State2").add_parent("State").insert()
     db.Record("State3").add_parent("State").insert()
+    # 1->
     db.Record("Transition1").add_parent("Transition").add_property("from", "State1").add_property("to", "State2").insert()
+    # 2->3
     db.Record("Transition2").add_parent("Transition").add_property("from", "State2").add_property("to", "State3").insert()
+    # 3->1
     db.Record("Transition3").add_parent("Transition").add_property("from", "State3").add_property("to", "State1").insert()
+    # 2->2
+    db.Record("Transition4").add_parent("Transition").add_property("from", "State2").add_property("to", "State2").insert()
 
-    db.Record("Model1").add_parent("StateModel").add_property("State", datatype=db.LIST("State"), value=["State1", "State2", "State3"]).add_property("Transition", datatype=db.LIST("Transition"), value=["Transition1", "Transition2", "Transition3"]).add_property("initial", "State1").add_property("final", "State1").insert()
+    db.Record("Model1").add_parent("StateModel").add_property("Transition", datatype=db.LIST("Transition"), value=["Transition1", "Transition2", "Transition3", "Transition4"]).add_property("initial", "State1").add_property("final", "State1").insert()
 
 def teardown():
     d = db.execute_query("FIND TestRT")
@@ -78,7 +83,10 @@ def test_transition_not_allowed():
 
     rec_insert.state = db.State(model="Model1", name="State3")
     with pytest.raises(db.TransactionError):
-        rec_update = rec_insert.update(sync=False)
+        rec_update = rec_insert.update(sync=False, raise_exception_on_error=False)
+        assert len(rec_update.get_errors()) == 1
+        assert rec_update.get_errors()[0].description == "Transition not allowed."
+        db.common.models.raise_errors(rec_update)
 
     rec_retrieve = db.Record.retrieve(rec_insert.id)
     assert rec_retrieve.state == rec.state
@@ -160,3 +168,44 @@ def test_state_not_in_state_model():
         rec.insert()
     assert len(rec.get_errors()) == 1
     assert rec.get_errors()[0].description == "State does not exist in this StateModel."
+
+def test_transition_with_out_state_change():
+    rec = db.Record()
+    rec.description = "old description"
+    rec.add_parent("TestRT")
+    rec.state = db.State(model="Model1", name="State1")
+    rec_insert = rec.insert(sync=False)
+
+    # first update attempt (should fail, because 1->1 not allowed)
+    rec_insert.description="updated description 1"
+    with pytest.raises(db.TransactionError):
+        # transition 1 -> 1 not allowed
+        rec_update = rec_insert.update(sync=False, raise_exception_on_error=False)
+        assert len(rec_update.get_errors()) == 1
+        assert rec_update.get_errors()[0].description == "Transition not allowed."
+        db.common.models.raise_errors(rec_update)
+
+    # second update with transition to state2
+    rec_update = db.Record(id=rec_insert.id).retrieve()
+    print(rec_update)
+    assert rec_update.state == db.State(model="Model1", name="State1")
+    assert rec_update.description == "old description"
+
+    rec_update.description = "updated description 2"
+    rec_update.state = db.State(name="State2", model="Model1")
+    # transition 1 -> 2 is allowed.
+    rec_update.update()
+
+    # third update without state change
+    rec_update = db.Record(id=rec_insert.id).retrieve()
+    print(rec_update)
+    assert rec_update.state == db.State(model="Model1", name="State2")
+    assert rec_update.description == "updated description 2"
+
+    rec_update.description = "updated description 3"
+    # transition 2 -> 2 is also allowed.
+    rec_update.update()
+
+    rec_final = db.Record.retrieve(rec_insert.id)
+    assert rec_final.description == "updated description 3"
+    assert rec_final.state == db.State(model="Model1", name="State2")
-- 
GitLab