server/test/unittest_storage.py
author Aurelien Campeas <aurelien.campeas@logilab.fr>
Tue, 28 Jan 2014 15:27:59 +0100
branchstable
changeset 9981 7099bbd685aa
parent 9267 24d9b86dfa54
child 9783 59c582ce68c8
permissions -rw-r--r--
[hooks/security] allow edition of attributes with permissive permissions If an attribute has more permissive security rules than the entity type itself, we should be green and not deny action because of an early global entity permission check (with the more restrictive rules). Only if one attribute with the entity-level permission rules is edited will the global check be performed. Note: * the "if action == 'delete'" check at the entry of check_entity_attributes is a guard for a condition currently not happening in cubicweb itself (but application hooks could conceivably call this function with a 'delete' action) Closes #3489895.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8544
3d049071957e massive copyright update to avoid clutering later patches
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8483
diff changeset
     1
# copyright 2003-2012 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5240
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
    18
"""unit tests for module cubicweb.server.sources.storages"""
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
    20
from logilab.common.testlib import unittest_main, tag, Tags
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
from cubicweb.devtools.testlib import CubicWebTC
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7979
diff changeset
    23
import os
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
import os.path as osp
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    25
import shutil
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    26
import tempfile
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
    28
from cubicweb import Binary, QueryError
8190
2a3c1b787688 [vreg] move base registry implementation to logilab.common. Closes #1916014
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8180
diff changeset
    29
from cubicweb.predicates import is_instance
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
from cubicweb.server.sources import storages
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
from cubicweb.server.hook import Hook, Operation
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    32
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    33
class DummyBeforeHook(Hook):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
    __regid__ = 'dummy-before-hook'
5877
0c7b7b76a84f [selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5717
diff changeset
    35
    __select__ = Hook.__select__ & is_instance('File')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
    events = ('before_add_entity',)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
    def __call__(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    39
        self._cw.transaction_data['orig_file_value'] = self.entity.data.getvalue()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    41
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
class DummyAfterHook(Hook):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
    __regid__ = 'dummy-after-hook'
5877
0c7b7b76a84f [selectors] provide a new, optimized, is_instance selector that should at some point replace implements (along with the adaptable selector)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5717
diff changeset
    44
    __select__ = Hook.__select__ & is_instance('File')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
    events = ('after_add_entity',)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    def __call__(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    48
        # new value of entity.data should be the same as before
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
        oldvalue = self._cw.transaction_data['orig_file_value']
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
        assert oldvalue == self.entity.data.getvalue()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
class StorageTC(CubicWebTC):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    53
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
    54
    tags = CubicWebTC.tags | Tags('Storage', 'BFSS')
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
    55
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
    def setup_database(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
        self.tempdir = tempfile.mkdtemp()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
        bfs_storage = storages.BytesFileSystemStorage(self.tempdir)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
        storages.set_attribute_storage(self.repo, 'File', 'data', bfs_storage)
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
    60
        storages.set_attribute_storage(self.repo, 'BFSSTestable', 'opt_attr', bfs_storage)
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
    def tearDown(self):
7057
daa1da99a071 [test] fix bad super call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6796
diff changeset
    63
        super(StorageTC, self).tearDown()
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
        storages.unset_attribute_storage(self.repo, 'File', 'data')
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
        shutil.rmtree(self.tempdir)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    68
    def create_file(self, content='the-data'):
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
        req = self.request()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
        return req.create_entity('File', data=Binary(content),
5240
2af0427e8ead [tests] fix bfss tests to match new uniquify implementation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5183
diff changeset
    71
                                 data_format=u'text/plain', data_name=u'foo.pdf')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
5183
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    73
    def fspath(self, entity):
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    74
        fspath = self.execute('Any fspath(D) WHERE F eid %(f)s, F data D',
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    75
                              {'f': entity.eid})[0][0]
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    76
        return fspath.getvalue()
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    77
6788
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    78
    def test_bfss_wrong_fspath_usage(self):
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    79
        f1 = self.create_file()
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    80
        self.execute('Any fspath(D) WHERE F eid %(f)s, F data D', {'f': f1.eid})
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    81
        with self.assertRaises(NotImplementedError) as cm:
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    82
            self.execute('Any fspath(F) WHERE F eid %(f)s', {'f': f1.eid})
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    83
        self.assertEqual(str(cm.exception),
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    84
                         'This callback is only available for BytesFileSystemStorage '
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    85
                         'managed attribute. Is FSPATH() argument BFSS managed?')
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    86
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    87
    def test_bfss_storage(self):
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    88
        f1 = self.create_file()
5240
2af0427e8ead [tests] fix bfss tests to match new uniquify implementation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5183
diff changeset
    89
        expected_filepath = osp.join(self.tempdir, '%s_data_%s' %
2af0427e8ead [tests] fix bfss tests to match new uniquify implementation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5183
diff changeset
    90
                                     (f1.eid, f1.data_name))
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
    91
        self.assertTrue(osp.isfile(expected_filepath))
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7979
diff changeset
    92
        # file should be read only
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7979
diff changeset
    93
        self.assertFalse(os.access(expected_filepath, os.W_OK))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    94
        self.assertEqual(file(expected_filepath).read(), 'the-data')
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    95
        self.rollback()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
    96
        self.assertFalse(osp.isfile(expected_filepath))
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    97
        f1 = self.create_file()
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    98
        self.commit()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
    99
        self.assertEqual(file(expected_filepath).read(), 'the-data')
8483
4ba11607d84a [entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
   100
        f1.cw_set(data=Binary('the new data'))
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   101
        self.rollback()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   102
        self.assertEqual(file(expected_filepath).read(), 'the-data')
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   103
        f1.cw_delete()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   104
        self.assertTrue(osp.isfile(expected_filepath))
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   105
        self.rollback()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   106
        self.assertTrue(osp.isfile(expected_filepath))
5557
1a534c596bff [entity] continue cleanup of Entity/AnyEntity namespace
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
   107
        f1.cw_delete()
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   108
        self.commit()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   109
        self.assertFalse(osp.isfile(expected_filepath))
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   110
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   111
    def test_bfss_sqlite_fspath(self):
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   112
        f1 = self.create_file()
5240
2af0427e8ead [tests] fix bfss tests to match new uniquify implementation
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5183
diff changeset
   113
        expected_filepath = osp.join(self.tempdir, '%s_data_%s' % (f1.eid, f1.data_name))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   114
        self.assertEqual(self.fspath(f1), expected_filepath)
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   115
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   116
    def test_bfss_fs_importing_doesnt_touch_path(self):
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   117
        self.session.transaction_data['fs_importing'] = True
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   118
        filepath = osp.abspath(__file__)
8581
ac3cbf55d9fb [entity attr cache] mark attribute as uncacheable in the underlying function else we may miss some changes.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8544
diff changeset
   119
        f1 = self.request().create_entity('File', data=Binary(filepath),
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   120
                                        data_format=u'text/plain', data_name=u'foo')
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   121
        self.assertEqual(self.fspath(f1), filepath)
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   122
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   123
    def test_source_storage_transparency(self):
5109
5cf83b9356d5 [test] use the new temporary_appojects CM to simplfy unittest_storage
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5013
diff changeset
   124
        with self.temporary_appobjects(DummyBeforeHook, DummyAfterHook):
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   125
            self.create_file()
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   126
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   127
    def test_source_mapped_attribute_error_cases(self):
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   128
        with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   129
            self.execute('Any X WHERE X data ~= "hop", X is File')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   130
        self.assertEqual(str(cm.exception), 'can\'t use File.data (X data ILIKE "hop") in restriction')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   131
        with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   132
            self.execute('Any X, Y WHERE X data D, Y data D, '
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   133
                         'NOT X identity Y, X is File, Y is File')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   134
        self.assertEqual(str(cm.exception), "can't use D as a restriction variable")
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   135
        # query returning mix of mapped / regular attributes (only file.data
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   136
        # mapped, not image.data for instance)
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   137
        with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   138
            self.execute('Any X WITH X BEING ('
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   139
                         ' (Any NULL)'
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   140
                         '  UNION '
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   141
                         ' (Any D WHERE X data D, X is File)'
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   142
                         ')')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   143
        self.assertEqual(str(cm.exception), 'query fetch some source mapped attribute, some not')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   144
        with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   145
            self.execute('(Any D WHERE X data D, X is File)'
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   146
                         ' UNION '
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   147
                         '(Any D WHERE X title D, X is Bookmark)')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   148
        self.assertEqual(str(cm.exception), 'query fetch some source mapped attribute, some not')
5717
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   149
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   150
        storages.set_attribute_storage(self.repo, 'State', 'name',
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   151
                                       storages.BytesFileSystemStorage(self.tempdir))
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   152
        try:
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   153
            with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   154
                self.execute('Any D WHERE X name D, X is IN (State, Transition)')
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   155
            self.assertEqual(str(cm.exception), 'query fetch some source mapped attribute, some not')
5717
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   156
        finally:
3c281b6f16c6 [3.9] fix tests
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5627
diff changeset
   157
            storages.unset_attribute_storage(self.repo, 'State', 'name')
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   158
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   159
    def test_source_mapped_attribute_advanced(self):
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   160
        f1 = self.create_file()
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   161
        rset = self.execute('Any X,D WITH D,X BEING ('
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   162
                            ' (Any D, X WHERE X eid %(x)s, X data D)'
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   163
                            '  UNION '
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   164
                            ' (Any D, X WHERE X eid %(x)s, X data D)'
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5131
diff changeset
   165
                            ')', {'x': f1.eid})
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   166
        self.assertEqual(len(rset), 2)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   167
        self.assertEqual(rset[0][0], f1.eid)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   168
        self.assertEqual(rset[1][0], f1.eid)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   169
        self.assertEqual(rset[0][1].getvalue(), 'the-data')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   170
        self.assertEqual(rset[1][1].getvalue(), 'the-data')
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   171
        rset = self.execute('Any X,LENGTH(D) WHERE X eid %(x)s, X data D',
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5131
diff changeset
   172
                            {'x': f1.eid})
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   173
        self.assertEqual(len(rset), 1)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   174
        self.assertEqual(rset[0][0], f1.eid)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   175
        self.assertEqual(rset[0][1], len('the-data'))
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   176
        rset = self.execute('Any X,LENGTH(D) WITH D,X BEING ('
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   177
                            ' (Any D, X WHERE X eid %(x)s, X data D)'
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   178
                            '  UNION '
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   179
                            ' (Any D, X WHERE X eid %(x)s, X data D)'
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5131
diff changeset
   180
                            ')', {'x': f1.eid})
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   181
        self.assertEqual(len(rset), 2)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   182
        self.assertEqual(rset[0][0], f1.eid)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   183
        self.assertEqual(rset[1][0], f1.eid)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   184
        self.assertEqual(rset[0][1], len('the-data'))
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   185
        self.assertEqual(rset[1][1], len('the-data'))
6796
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   186
        with self.assertRaises(QueryError) as cm:
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   187
            self.execute('Any X,UPPER(D) WHERE X eid %(x)s, X data D',
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   188
                         {'x': f1.eid})
e70ca9abfc51 [unittest2] update to unittest2 assertRaises api
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6788
diff changeset
   189
        self.assertEqual(str(cm.exception), 'UPPER can not be called on mapped attribute')
5013
ad91f93bbb93 [source storage] refactor source sql generation and results handling to allow repository side callbacks
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5008
diff changeset
   190
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   191
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   192
    def test_bfss_fs_importing_transparency(self):
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   193
        self.session.transaction_data['fs_importing'] = True
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   194
        filepath = osp.abspath(__file__)
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   195
        f1 = self.session.create_entity('File', data=Binary(filepath),
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   196
                                        data_format=u'text/plain', data_name=u'foo')
8622
db988713459d [server] make `test_bfss_fs_importing_transparency` less verbose on failure
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8581
diff changeset
   197
        cw_value = f1.data.getvalue()
db988713459d [server] make `test_bfss_fs_importing_transparency` less verbose on failure
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8581
diff changeset
   198
        fs_value = file(filepath).read()
db988713459d [server] make `test_bfss_fs_importing_transparency` less verbose on failure
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8581
diff changeset
   199
        if cw_value != fs_value:
db988713459d [server] make `test_bfss_fs_importing_transparency` less verbose on failure
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8581
diff changeset
   200
            self.fail('cw value %r is different from file content' % cw_value)
db988713459d [server] make `test_bfss_fs_importing_transparency` less verbose on failure
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8581
diff changeset
   201
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   202
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   203
    @tag('update')
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   204
    def test_bfss_update_with_existing_data(self):
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   205
        # use self.session to use server-side cache
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   206
        f1 = self.session.create_entity('File', data=Binary('some data'),
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   207
                                        data_format=u'text/plain', data_name=u'foo')
8483
4ba11607d84a [entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
   208
        # NOTE: do not use cw_set() which would automatically
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   209
        #       update f1's local dict. We want the pure rql version to work
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   210
        self.execute('SET F data %(d)s WHERE F eid %(f)s',
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   211
                     {'d': Binary('some other data'), 'f': f1.eid})
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   212
        self.assertEqual(f1.data.getvalue(), 'some other data')
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   213
        self.commit()
5174
78438ad513ca #759035: Automate addition of eid cachekey in RQL analysis
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5131
diff changeset
   214
        f2 = self.execute('Any F WHERE F eid %(f)s, F is File', {'f': f1.eid}).get_entity(0, 0)
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   215
        self.assertEqual(f2.data.getvalue(), 'some other data')
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   216
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   217
    @tag('update', 'extension', 'commit')
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   218
    def test_bfss_update_with_different_extension_commited(self):
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   219
        # use self.session to use server-side cache
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   220
        f1 = self.session.create_entity('File', data=Binary('some data'),
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   221
                                        data_format=u'text/plain', data_name=u'foo.txt')
8483
4ba11607d84a [entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
   222
        # NOTE: do not use cw_set() which would automatically
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   223
        #       update f1's local dict. We want the pure rql version to work
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   224
        self.commit()
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   225
        old_path = self.fspath(f1)
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   226
        self.assertTrue(osp.isfile(old_path))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   227
        self.assertEqual(osp.splitext(old_path)[1], '.txt')
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   228
        self.execute('SET F data %(d)s, F data_name %(dn)s, F data_format %(df)s WHERE F eid %(f)s',
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   229
                     {'d': Binary('some other data'), 'f': f1.eid, 'dn': u'bar.jpg', 'df': u'image/jpeg'})
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   230
        self.commit()
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   231
        # the new file exists with correct extension
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   232
        # the old file is dead
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   233
        f2 = self.execute('Any F WHERE F eid %(f)s, F is File', {'f': f1.eid}).get_entity(0, 0)
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   234
        new_path = self.fspath(f2)
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   235
        self.assertFalse(osp.isfile(old_path))
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   236
        self.assertTrue(osp.isfile(new_path))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   237
        self.assertEqual(osp.splitext(new_path)[1], '.jpg')
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   238
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   239
    @tag('update', 'extension', 'rollback')
9267
24d9b86dfa54 spelling: rollbacked -> rolled back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8694
diff changeset
   240
    def test_bfss_update_with_different_extension_rolled_back(self):
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   241
        # use self.session to use server-side cache
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   242
        f1 = self.session.create_entity('File', data=Binary('some data'),
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   243
                                        data_format=u'text/plain', data_name=u'foo.txt')
8483
4ba11607d84a [entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
   244
        # NOTE: do not use cw_set() which would automatically
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   245
        #       update f1's local dict. We want the pure rql version to work
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   246
        self.commit()
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   247
        old_path = self.fspath(f1)
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   248
        old_data = f1.data.getvalue()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   249
        self.assertTrue(osp.isfile(old_path))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   250
        self.assertEqual(osp.splitext(old_path)[1], '.txt')
5599
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   251
        self.execute('SET F data %(d)s, F data_name %(dn)s, F data_format %(df)s WHERE F eid %(f)s',
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   252
                     {'d': Binary('some other data'), 'f': f1.eid, 'dn': u'bar.jpg', 'df': u'image/jpeg'})
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   253
        self.rollback()
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   254
        # the new file exists with correct extension
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   255
        # the old file is dead
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   256
        f2 = self.execute('Any F WHERE F eid %(f)s, F is File', {'f': f1.eid}).get_entity(0, 0)
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   257
        new_path = self.fspath(f2)
be94157bd754 [bfss] Rename filenames according to their metadata on entity update.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 5426
diff changeset
   258
        new_data = f2.data.getvalue()
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   259
        self.assertTrue(osp.isfile(new_path))
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   260
        self.assertEqual(osp.splitext(new_path)[1], '.txt')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   261
        self.assertEqual(old_path, new_path)
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   262
        self.assertEqual(old_data, new_data)
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   263
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   264
    @tag('update', 'NULL')
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   265
    def test_bfss_update_to_None(self):
7711
458cb2edf63a [repo test] Fix test broken by BFSSTestable
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7694
diff changeset
   266
        f = self.session.create_entity('Affaire', opt_attr=Binary('toto'))
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   267
        self.session.commit()
7977
e2d3ff3e7660 [test] drop some deprecation warnings
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   268
        self.session.set_cnxset()
8483
4ba11607d84a [entity api] unify set_attributes / set_relations into a cw_set method. Closes #2423719
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8190
diff changeset
   269
        f.cw_set(opt_attr=None)
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   270
        self.session.commit()
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   271
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   272
    @tag('fs_importing', 'update')
5183
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   273
    def test_bfss_update_with_fs_importing(self):
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   274
        # use self.session to use server-side cache
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   275
        f1 = self.session.create_entity('File', data=Binary('some data'),
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   276
                                        data_format=u'text/plain', data_name=u'foo')
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   277
        old_fspath = self.fspath(f1)
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   278
        self.session.transaction_data['fs_importing'] = True
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   279
        new_fspath = osp.join(self.tempdir, 'newfile.txt')
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   280
        file(new_fspath, 'w').write('the new data')
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   281
        self.execute('SET F data %(d)s WHERE F eid %(f)s',
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   282
                     {'d': Binary(new_fspath), 'f': f1.eid})
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   283
        self.commit()
6340
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   284
        self.assertEqual(f1.data.getvalue(), 'the new data')
470d8e828fda [test] update test to unittest2 api (still using lgc.testlib though)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5877
diff changeset
   285
        self.assertEqual(self.fspath(f1), new_fspath)
7791
31bb51ea5485 [deprecation] fix unittest pending deprecation warnings on failIf/failUnless methods family
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7711
diff changeset
   286
        self.assertFalse(osp.isfile(old_fspath))
5183
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   287
6383
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   288
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   289
    def test_clean(self):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   290
        fsimport = storages.fsimport
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   291
        td = self.session.transaction_data
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   292
        self.assertNotIn('fs_importing', td)
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   293
        with fsimport(self.session):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   294
            self.assertIn('fs_importing', td)
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   295
            self.assertTrue(td['fs_importing'])
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   296
        self.assertNotIn('fs_importing', td)
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   297
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   298
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   299
    def test_true(self):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   300
        fsimport = storages.fsimport
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   301
        td = self.session.transaction_data
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   302
        td['fs_importing'] = True
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   303
        with fsimport(self.session):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   304
            self.assertIn('fs_importing', td)
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   305
            self.assertTrue(td['fs_importing'])
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   306
        self.assertTrue(td['fs_importing'])
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   307
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   308
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   309
    def test_False(self):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   310
        fsimport = storages.fsimport
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   311
        td = self.session.transaction_data
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   312
        td['fs_importing'] = False
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   313
        with fsimport(self.session):
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   314
            self.assertIn('fs_importing', td)
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   315
            self.assertTrue(td['fs_importing'])
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   316
        self.assertFalse(td['fs_importing'])
5183
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
   317
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   318
if __name__ == '__main__':
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   319
    unittest_main()