aboutsummaryrefslogtreecommitdiffstats
path: root/test/graph/ac/test_null.py
blob: 544a01ea343083109b8b59c30653df95ac3dbd96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
"""

Part of the bsfs test suite.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2022
"""
# imports
import unittest

# bsie imports
from bsfs import schema as bsc
from bsfs.namespace import ns
from bsfs.query import ast
from bsfs.triple_store import SparqlStore
from bsfs.utils import URI

# objects to test
from bsfs.graph.ac.null import NullAC


## code ##

class TestNullAC(unittest.TestCase):
    def setUp(self):
        self.backend = SparqlStore()
        self.backend.schema = bsc.from_string('''
            prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
            prefix xsd: <http://www.w3.org/2001/XMLSchema#>

            prefix bsfs: <http://bsfs.ai/schema/>
            prefix bsm: <http://bsfs.ai/schema/Meta#>
            prefix bse: <http://bsfs.ai/schema/Entity#>

            bsfs:Entity rdfs:subClassOf bsfs:Node .
            bsfs:Tag rdfs:subClassOf bsfs:Node .
            xsd:string rdfs:subClassOf bsfs:Literal .
            bsfs:Number rdfs:subClassOf bsfs:Literal .
            xsd:integer rdfs:subClassOf bsfs:Number .

            # predicates mandated by Nodes
            bsm:t_created rdfs:subClassOf bsfs:Predicate ;
                rdfs:domain bsfs:Node ;
                rdfs:range xsd:integer ;
                bsfs:unique "true"^^xsd:boolean .

            # additionally defined predicates
            bse:tag rdfs:subClassOf bsfs:Predicate ;
                rdfs:domain bsfs:Entity ;
                rdfs:range bsfs:Tag ;
                bsfs:unique "false"^^xsd:boolean .

            bse:author rdfs:subClassOf bsfs:Predicate ;
                rdfs:domain bsfs:Entity ;
                rdfs:range xsd:string ;
                bsfs:unique "true"^^xsd:boolean .

            bse:filesize rdfs:subClassOf bsfs:Predicate ;
                rdfs:domain bsfs:Entity ;
                rdfs:range xsd:integer ;
                bsfs:unique "false"^^xsd:boolean .

            ''')
        self.user = URI('http://www.example.com/me')
        self.p_author = self.backend.schema.predicate(ns.bse.author)
        self.p_filesize = self.backend.schema.predicate(ns.bse.filesize)
        self.p_tag = self.backend.schema.predicate(ns.bse.tag)
        self.p_created = self.backend.schema.predicate(ns.bsm.t_created)
        self.ent_type = self.backend.schema.node(ns.bsfs.Entity)
        self.ent_ids = {URI('http://www.example.com/me/entity#1234'), URI('http://www.example.com/me/entity#4321')}

    def test_essentials(self):
        ac = NullAC(self.backend, self.user)
        # equal construction means equal instance
        self.assertEqual(NullAC(self.backend, self.user), NullAC(self.backend, self.user))
        self.assertEqual(hash(NullAC(self.backend, self.user)), hash(NullAC(self.backend, self.user)))
        self.assertEqual(ac, NullAC(self.backend, self.user))
        self.assertEqual(hash(ac), hash(NullAC(self.backend, self.user)))
        # equivalence respects type
        class Foo(): pass
        self.assertNotEqual(ac, 1234)
        self.assertNotEqual(hash(ac), hash(1234))
        self.assertNotEqual(ac, 'hello')
        self.assertNotEqual(hash(ac), hash('hello'))
        self.assertNotEqual(ac, Foo())
        self.assertNotEqual(hash(ac), hash(Foo()))
        # equivalence respects backend
        self.assertNotEqual(ac, NullAC(SparqlStore(), self.user))
        self.assertNotEqual(hash(ac), hash(NullAC(SparqlStore(), self.user)))
        # equivalence respects user
        self.assertNotEqual(ac, NullAC(self.backend, URI('http://www.example.com/you')))
        self.assertNotEqual(hash(ac), hash(NullAC(self.backend, URI('http://www.example.com/you'))))
        # string conversion
        self.assertEqual(str(ac), f'NullAC({self.user})')
        self.assertEqual(repr(ac), f'NullAC({self.user})')
        # string conversion respects user
        self.assertEqual(str(NullAC(self.backend, URI('http://www.example.com/you'))),
            f'NullAC(http://www.example.com/you)')
        self.assertEqual(repr(NullAC(self.backend, URI('http://www.example.com/you'))),
            f'NullAC(http://www.example.com/you)')

    def test_is_protected_predicate(self):
        ac = NullAC(self.backend, self.user)
        self.assertTrue(ac.is_protected_predicate(self.p_created))
        self.assertFalse(ac.is_protected_predicate(self.p_filesize))
        self.assertFalse(ac.is_protected_predicate(self.p_author))
        self.assertFalse(ac.is_protected_predicate(self.p_tag))

    def test_create(self):
        ac = NullAC(self.backend, self.user)
        self.assertEqual(None, ac.create(self.ent_type, self.ent_ids))

    def test_link_from_node(self):
        ac = NullAC(self.backend, self.user)
        self.assertSetEqual(self.ent_ids, ac.link_from_node(self.ent_type, self.ent_ids))

    def test_link_to_node(self):
        ac = NullAC(self.backend, self.user)
        self.assertSetEqual(self.ent_ids, ac.link_to_node(self.ent_type, self.ent_ids))

    def test_write_literal(self):
        ac = NullAC(self.backend, self.user)
        self.assertSetEqual(self.ent_ids, ac.write_literal(self.ent_type, self.ent_ids))

    def test_createable(self):
        ac = NullAC(self.backend, self.user)
        self.assertSetEqual(self.ent_ids, ac.createable(self.ent_type, self.ent_ids))

    def test_filter_read(self):
        query = ast.filter.Or(
            ast.filter.Any(ns.bse.tag, ast.filter.Is('http://example.com/tag#1234')),
            ast.filter.Any(ns.bse.tag, ast.filter.Is('http://example.com/tag#4321')),
            ast.filter.Any(ns.bse.author, ast.filter.Equals('Me, Myself, and I')))
        ac = NullAC(self.backend, self.user)
        # NullAC returns query
        self.assertEqual(query, ac.filter_read(self.ent_type, query))
        # query can be none
        self.assertIsNone(ac.filter_read(self.ent_type, None))


## main ##

if __name__ == '__main__':
    unittest.main()

## EOF ##