# -*- coding=utf8 -*- import unittest from rdflib import Graph, Namespace from rdflib.plugins.stores.auditable import AuditableStore EX = Namespace("http://example.org/") class BaseTestAuditableStore(unittest.TestCase): def assert_graph_equal(self, g1, g2): try: return self.assertSetEqual(set(g1), set(g2)) except AttributeError: # python2.6 does not have assertSetEqual assert set(g1) == set(g2) class TestAuditableStore(BaseTestAuditableStore): def setUp(self): self.g = Graph() self.g.add((EX.s0, EX.p0, EX.o0)) self.g.add((EX.s0, EX.p0, EX.o0bis)) self.t = Graph(AuditableStore(self.g.store), self.g.identifier) def test_add_commit(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), (EX.s1, EX.p1, EX.o1), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), (EX.s1, EX.p1, EX.o1), ], ) def test_remove_commit(self): self.t.remove((EX.s0, EX.p0, EX.o0)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0bis), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0bis), ], ) def test_multiple_remove_commit(self): self.t.remove((EX.s0, EX.p0, None)) self.assert_graph_equal(self.t, []) self.t.commit() self.assert_graph_equal(self.g, []) def test_noop_add_commit(self): self.t.add((EX.s0, EX.p0, EX.o0)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_noop_remove_commit(self): self.t.add((EX.s0, EX.p0, EX.o0)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_add_remove_commit(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.t.remove((EX.s1, EX.p1, EX.o1)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_remove_add_commit(self): self.t.remove((EX.s1, EX.p1, EX.o1)) self.t.add((EX.s1, EX.p1, EX.o1)) self.assert_graph_equal( self.t, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), (EX.s1, EX.p1, EX.o1), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), (EX.s1, EX.p1, EX.o1), ], ) def test_add_rollback(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_remove_rollback(self): self.t.remove((EX.s0, EX.p0, EX.o0)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_multiple_remove_rollback(self): self.t.remove((EX.s0, EX.p0, None)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_noop_add_rollback(self): self.t.add((EX.s0, EX.p0, EX.o0)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_noop_remove_rollback(self): self.t.add((EX.s0, EX.p0, EX.o0)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_add_remove_rollback(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.t.remove((EX.s1, EX.p1, EX.o1)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_remove_add_rollback(self): self.t.remove((EX.s1, EX.p1, EX.o1)) self.t.add((EX.s1, EX.p1, EX.o1)) self.t.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) class TestAuditableStoreEmptyGraph(BaseTestAuditableStore): def setUp(self): self.g = Graph() self.t = Graph(AuditableStore(self.g.store), self.g.identifier) def test_add_commit(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.assert_graph_equal( self.t, [ (EX.s1, EX.p1, EX.o1), ], ) self.t.commit() self.assert_graph_equal( self.g, [ (EX.s1, EX.p1, EX.o1), ], ) def test_add_rollback(self): self.t.add((EX.s1, EX.p1, EX.o1)) self.t.rollback() self.assert_graph_equal(self.g, []) class TestAuditableStoreConccurent(BaseTestAuditableStore): def setUp(self): self.g = Graph() self.g.add((EX.s0, EX.p0, EX.o0)) self.g.add((EX.s0, EX.p0, EX.o0bis)) self.t1 = Graph(AuditableStore(self.g.store), self.g.identifier) self.t2 = Graph(AuditableStore(self.g.store), self.g.identifier) self.t1.add((EX.s1, EX.p1, EX.o1)) self.t2.add((EX.s2, EX.p2, EX.o2)) self.t1.remove((EX.s0, EX.p0, EX.o0)) self.t2.remove((EX.s0, EX.p0, EX.o0bis)) def test_commit_commit(self): self.t1.commit() self.t2.commit() self.assert_graph_equal( self.g, [ (EX.s1, EX.p1, EX.o1), (EX.s2, EX.p2, EX.o2), ], ) def test_commit_rollback(self): self.t1.commit() self.t2.rollback() self.assert_graph_equal( self.g, [ (EX.s1, EX.p1, EX.o1), (EX.s0, EX.p0, EX.o0bis), ], ) def test_rollback_commit(self): self.t1.rollback() self.t2.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s2, EX.p2, EX.o2), ], ) def test_rollback_rollback(self): self.t1.rollback() self.t2.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) class TestAuditableStoreEmbeded(BaseTestAuditableStore): def setUp(self): self.g = Graph() self.g.add((EX.s0, EX.p0, EX.o0)) self.g.add((EX.s0, EX.p0, EX.o0bis)) self.t1 = Graph(AuditableStore(self.g.store), self.g.identifier) self.t1.add((EX.s1, EX.p1, EX.o1)) self.t1.remove((EX.s0, EX.p0, EX.o0bis)) self.t2 = Graph(AuditableStore(self.t1.store), self.t1.identifier) self.t2.add((EX.s2, EX.p2, EX.o2)) self.t2.remove((EX.s1, EX.p1, EX.o1)) def test_commit_commit(self): self.assert_graph_equal( self.t2, [ (EX.s0, EX.p0, EX.o0), (EX.s2, EX.p2, EX.o2), ], ) self.t2.commit() self.assert_graph_equal( self.t1, [ (EX.s0, EX.p0, EX.o0), (EX.s2, EX.p2, EX.o2), ], ) self.t1.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s2, EX.p2, EX.o2), ], ) def test_commit_rollback(self): self.t2.commit() self.t1.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], ) def test_rollback_commit(self): self.t2.rollback() self.assert_graph_equal( self.t1, [ (EX.s0, EX.p0, EX.o0), (EX.s1, EX.p1, EX.o1), ], ) self.t1.commit() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s1, EX.p1, EX.o1), ], ) def test_rollback_rollback(self): self.t2.rollback() self.t1.rollback() self.assert_graph_equal( self.g, [ (EX.s0, EX.p0, EX.o0), (EX.s0, EX.p0, EX.o0bis), ], )