server/test/unittest_storage.py
author Rémi Cardona <remi.cardona@logilab.fr>
Fri, 18 Sep 2015 11:54:12 +0200
changeset 10706 b261d90149d0
parent 10705 e7eafadbeb15
permissions -rw-r--r--
[server] Port BFSS to py3k The BFSS API changes in python 3: * 'defaultdir' MUST be a unicode object * 'fsencoding' MUST NOT be set In python 2, fsencoding handles both the encoding of file paths on the file system (utf-8 by default, but the system may actually be using something else) and the encoding of file paths that will be stored in the database. So in python 3, we wipe the slate clean: * rely on sys.getfilesystemencoding() to convert unicode objects to bytes * always encode paths to utf-8 for storage in the database Caveat emptor / here be dragons: * sys.getfilesystemencoding() depends on the current locale, which therefore MUST be set properly * when migrating an existing instance from py2 to py3, one MAY need to reencode file paths stored in the database
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
     1
# copyright 2003-2014 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
10706
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    20
from six import PY2
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    21
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
    22
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
    23
from cubicweb.devtools.testlib import CubicWebTC
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
10453
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
    25
from glob import glob
8180
1f6ba9afb925 [storage] BFSS now create read only file (closes #2151672)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7979
diff changeset
    26
import os
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    27
import os.path as osp
10706
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    28
import sys
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    29
import shutil
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    30
import tempfile
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
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
    32
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
    33
from cubicweb.predicates import is_instance
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
from cubicweb.server.sources import storages
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    35
from cubicweb.server.hook import Hook
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
class DummyBeforeHook(Hook):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    38
    __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
    39
    __select__ = Hook.__select__ & is_instance('File')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    40
    events = ('before_add_entity',)
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
    def __call__(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
        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
    44
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    46
class DummyAfterHook(Hook):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    47
    __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
    48
    __select__ = Hook.__select__ & is_instance('File')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    49
    events = ('after_add_entity',)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    51
    def __call__(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    52
        # 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
    53
        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
    54
        assert oldvalue == self.entity.data.getvalue()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    55
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    56
class StorageTC(CubicWebTC):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    57
    tempdir = None
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
    58
    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
    59
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
    def setup_database(self):
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
        self.tempdir = tempfile.mkdtemp()
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
        bfs_storage = storages.BytesFileSystemStorage(self.tempdir)
10706
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    63
        self.bfs_storage = bfs_storage
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
        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
    65
        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
    66
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
    def tearDown(self):
7057
daa1da99a071 [test] fix bad super call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6796
diff changeset
    68
        super(StorageTC, self).tearDown()
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
        storages.unset_attribute_storage(self.repo, 'File', 'data')
10706
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    70
        del self.bfs_storage
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
        shutil.rmtree(self.tempdir)
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
    74
    def create_file(self, cnx, content=b'the-data'):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    75
        return cnx.create_entity('File', data=Binary(content),
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    76
                                 data_format=u'text/plain',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    77
                                 data_name=u'foo.pdf')
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    79
    def fspath(self, cnx, entity):
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    80
        fspath = cnx.execute('Any fspath(D) WHERE F eid %(f)s, F data D',
10706
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    81
                             {'f': entity.eid})[0][0].getvalue()
b261d90149d0 [server] Port BFSS to py3k
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10705
diff changeset
    82
        return fspath if PY2 else fspath.decode('utf-8')
5183
8d66003351f8 [storage] consider fs_importing on update operations too
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5131
diff changeset
    83
6788
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    84
    def test_bfss_wrong_fspath_usage(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    85
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    86
            f1 = self.create_file(cnx)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    87
            cnx.execute('Any fspath(D) WHERE F eid %(f)s, F data D', {'f': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    88
            with self.assertRaises(NotImplementedError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    89
                cnx.execute('Any fspath(F) WHERE F eid %(f)s', {'f': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    90
            self.assertEqual(str(cm.exception),
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    91
                             'This callback is only available for BytesFileSystemStorage '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
    92
                             'managed attribute. Is FSPATH() argument BFSS managed?')
6788
0f31ed3fff79 [bfss storage] Improve fspath() error message.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6383
diff changeset
    93
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
    94
    def test_bfss_storage(self):
10550
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
    95
        with self.admin_access.web_request() as req:
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
    96
            cnx = req.cnx
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
    97
            f1 = self.create_file(req)
10453
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
    98
            filepaths = glob(osp.join(self.tempdir, '%s_data_*' % f1.eid))
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
    99
            self.assertEqual(len(filepaths), 1, filepaths)
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   100
            expected_filepath = filepaths[0]
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   101
            # file should be read only
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   102
            self.assertFalse(os.access(expected_filepath, os.W_OK))
10550
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   103
            self.assertEqual(open(expected_filepath).read(), 'the-data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   104
            cnx.rollback()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   105
            self.assertFalse(osp.isfile(expected_filepath))
10453
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   106
            filepaths = glob(osp.join(self.tempdir, '%s_data_*' % f1.eid))
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   107
            self.assertEqual(len(filepaths), 0, filepaths)
10550
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   108
            f1 = self.create_file(req)
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   109
            cnx.commit()
10453
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   110
            filepaths = glob(osp.join(self.tempdir, '%s_data_*' % f1.eid))
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   111
            self.assertEqual(len(filepaths), 1, filepaths)
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   112
            expected_filepath = filepaths[0]
10550
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   113
            self.assertEqual(open(expected_filepath).read(), 'the-data')
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   114
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   115
            # add f1 back to the entity cache with req as _cw
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   116
            f1 = req.entity_from_eid(f1.eid)
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   117
            f1.cw_set(data=Binary(b'the new data'))
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   118
            cnx.rollback()
10550
d4bd28d5fca8 [server/sources] make sure entity._cw is a Connection before calling Storages
Julien Cristau <julien.cristau@logilab.fr>
parents: 10453
diff changeset
   119
            self.assertEqual(open(expected_filepath).read(), 'the-data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   120
            f1.cw_delete()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   121
            self.assertTrue(osp.isfile(expected_filepath))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   122
            cnx.rollback()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   123
            self.assertTrue(osp.isfile(expected_filepath))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   124
            f1.cw_delete()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   125
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   126
            self.assertFalse(osp.isfile(expected_filepath))
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   127
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   128
    def test_bfss_sqlite_fspath(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   129
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   130
            f1 = self.create_file(cnx)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   131
            expected_filepath = osp.join(self.tempdir, '%s_data_%s' % (f1.eid, f1.data_name))
10453
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   132
            base, ext = osp.splitext(expected_filepath)
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   133
            self.assertTrue(self.fspath(cnx, f1).startswith(base))
76f601a90aa7 [storage] use mkstemp to create files in bfss
Julien Cristau <julien.cristau@logilab.fr>
parents: 9783
diff changeset
   134
            self.assertTrue(self.fspath(cnx, f1).endswith(ext))
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   135
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   136
    def test_bfss_fs_importing_doesnt_touch_path(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   137
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   138
            cnx.transaction_data['fs_importing'] = True
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   139
            filepath = osp.abspath(__file__)
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   140
            f1 = cnx.create_entity('File', data=Binary(filepath.encode(sys.getfilesystemencoding())),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   141
                                   data_format=u'text/plain', data_name=u'foo')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   142
            self.assertEqual(self.fspath(cnx, f1), filepath)
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   143
5008
385bf22e3c12 [bfss test] some minor refactoring. Test deletion + creation/update/deletion rollback
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4967
diff changeset
   144
    def test_source_storage_transparency(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   145
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   146
            with self.temporary_appobjects(DummyBeforeHook, DummyAfterHook):
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   147
                self.create_file(cnx)
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
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
   149
    def test_source_mapped_attribute_error_cases(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   150
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   151
            with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   152
                cnx.execute('Any X WHERE X data ~= "hop", X is File')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   153
            self.assertEqual(str(cm.exception), 'can\'t use File.data (X data ILIKE "hop") in restriction')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   154
            with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   155
                cnx.execute('Any X, Y WHERE X data D, Y data D, '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   156
                             'NOT X identity Y, X is File, Y is File')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   157
            self.assertEqual(str(cm.exception), "can't use D as a restriction variable")
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   158
            # query returning mix of mapped / regular attributes (only file.data
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   159
            # mapped, not image.data for instance)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   160
            with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   161
                cnx.execute('Any X WITH X BEING ('
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   162
                             ' (Any NULL)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   163
                             '  UNION '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   164
                             ' (Any D WHERE X data D, X is File)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   165
                             ')')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   166
            self.assertEqual(str(cm.exception), 'query fetch some source mapped attribute, some not')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   167
            with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   168
                cnx.execute('(Any D WHERE X data D, X is File)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   169
                             ' UNION '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   170
                             '(Any D WHERE X title D, X is Bookmark)')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   171
            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
   172
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   173
            storages.set_attribute_storage(self.repo, 'State', 'name',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   174
                                           storages.BytesFileSystemStorage(self.tempdir))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   175
            try:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   176
                with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   177
                    cnx.execute('Any D WHERE X name D, X is IN (State, Transition)')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   178
                self.assertEqual(str(cm.exception), 'query fetch some source mapped attribute, some not')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   179
            finally:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   180
                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
   181
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
   182
    def test_source_mapped_attribute_advanced(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   183
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   184
            f1 = self.create_file(cnx)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   185
            rset = cnx.execute('Any X,D WITH D,X BEING ('
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   186
                                ' (Any D, X WHERE X eid %(x)s, X data D)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   187
                                '  UNION '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   188
                                ' (Any D, X WHERE X eid %(x)s, X data D)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   189
                                ')', {'x': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   190
            self.assertEqual(len(rset), 2)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   191
            self.assertEqual(rset[0][0], f1.eid)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   192
            self.assertEqual(rset[1][0], f1.eid)
10705
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   193
            self.assertEqual(rset[0][1].getvalue(), b'the-data')
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   194
            self.assertEqual(rset[1][1].getvalue(), b'the-data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   195
            rset = cnx.execute('Any X,LENGTH(D) WHERE X eid %(x)s, X data D',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   196
                                {'x': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   197
            self.assertEqual(len(rset), 1)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   198
            self.assertEqual(rset[0][0], f1.eid)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   199
            self.assertEqual(rset[0][1], len('the-data'))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   200
            rset = cnx.execute('Any X,LENGTH(D) WITH D,X BEING ('
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   201
                                ' (Any D, X WHERE X eid %(x)s, X data D)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   202
                                '  UNION '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   203
                                ' (Any D, X WHERE X eid %(x)s, X data D)'
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   204
                                ')', {'x': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   205
            self.assertEqual(len(rset), 2)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   206
            self.assertEqual(rset[0][0], f1.eid)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   207
            self.assertEqual(rset[1][0], f1.eid)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   208
            self.assertEqual(rset[0][1], len('the-data'))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   209
            self.assertEqual(rset[1][1], len('the-data'))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   210
            with self.assertRaises(QueryError) as cm:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   211
                cnx.execute('Any X,UPPER(D) WHERE X eid %(x)s, X data D',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   212
                             {'x': f1.eid})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   213
            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
   214
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   215
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   216
    def test_bfss_fs_importing_transparency(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   217
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   218
            cnx.transaction_data['fs_importing'] = True
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   219
            filepath = osp.abspath(__file__)
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   220
            f1 = cnx.create_entity('File', data=Binary(filepath.encode(sys.getfilesystemencoding())),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   221
                                   data_format=u'text/plain', data_name=u'foo')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   222
            cw_value = f1.data.getvalue()
10705
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   223
            fs_value = open(filepath, 'rb').read()
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   224
            if cw_value != fs_value:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   225
                self.fail('cw value %r is different from file content' % cw_value)
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   226
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   227
    @tag('update')
5131
88b5ca8da928 [storages] fix fs_importing side-effect on entity.data
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5109
diff changeset
   228
    def test_bfss_update_with_existing_data(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   229
        with self.admin_access.repo_cnx() as cnx:
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   230
            f1 = cnx.create_entity('File', data=Binary(b'some data'),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   231
                                   data_format=u'text/plain', data_name=u'foo')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   232
            # NOTE: do not use cw_set() which would automatically
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   233
            #       update f1's local dict. We want the pure rql version to work
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   234
            cnx.execute('SET F data %(d)s WHERE F eid %(f)s',
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   235
                         {'d': Binary(b'some other data'), 'f': f1.eid})
10705
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   236
            self.assertEqual(f1.data.getvalue(), b'some other data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   237
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   238
            f2 = cnx.execute('Any F WHERE F eid %(f)s, F is File', {'f': f1.eid}).get_entity(0, 0)
10705
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   239
            self.assertEqual(f2.data.getvalue(), b'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
   240
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   241
    @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
   242
    def test_bfss_update_with_different_extension_commited(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   243
        with self.admin_access.repo_cnx() as cnx:
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   244
            f1 = cnx.create_entity('File', data=Binary(b'some data'),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   245
                                   data_format=u'text/plain', data_name=u'foo.txt')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   246
            # NOTE: do not use cw_set() which would automatically
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   247
            #       update f1's local dict. We want the pure rql version to work
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   248
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   249
            old_path = self.fspath(cnx, f1)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   250
            self.assertTrue(osp.isfile(old_path))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   251
            self.assertEqual(osp.splitext(old_path)[1], '.txt')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   252
            cnx.execute('SET F data %(d)s, F data_name %(dn)s, '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   253
                         'F data_format %(df)s WHERE F eid %(f)s',
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   254
                         {'d': Binary(b'some other data'), 'f': f1.eid,
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   255
                          'dn': u'bar.jpg', 'df': u'image/jpeg'})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   256
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   257
            # the new file exists with correct extension
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   258
            # the old file is dead
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   259
            f2 = cnx.execute('Any F WHERE F eid %(f)s, F is File', {'f': f1.eid}).get_entity(0, 0)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   260
            new_path = self.fspath(cnx, f2)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   261
            self.assertFalse(osp.isfile(old_path))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   262
            self.assertTrue(osp.isfile(new_path))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   263
            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
   264
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   265
    @tag('update', 'extension', 'rollback')
9267
24d9b86dfa54 spelling: rollbacked -> rolled back
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8694
diff changeset
   266
    def test_bfss_update_with_different_extension_rolled_back(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   267
        with self.admin_access.repo_cnx() as cnx:
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   268
            f1 = cnx.create_entity('File', data=Binary(b'some data'),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   269
                                   data_format=u'text/plain', data_name=u'foo.txt')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   270
            # NOTE: do not use cw_set() which would automatically
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   271
            #       update f1's local dict. We want the pure rql version to work
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   272
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   273
            old_path = self.fspath(cnx, f1)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   274
            old_data = f1.data.getvalue()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   275
            self.assertTrue(osp.isfile(old_path))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   276
            self.assertEqual(osp.splitext(old_path)[1], '.txt')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   277
            cnx.execute('SET F data %(d)s, F data_name %(dn)s, '
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   278
                         'F data_format %(df)s WHERE F eid %(f)s',
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   279
                         {'d': Binary(b'some other data'),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   280
                          'f': f1.eid,
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   281
                          'dn': u'bar.jpg',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   282
                          'df': u'image/jpeg'})
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   283
            cnx.rollback()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   284
            # the new file exists with correct extension
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   285
            # the old file is dead
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   286
            f2 = cnx.execute('Any F WHERE F eid %(f)s, F is File',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   287
                              {'f': f1.eid}).get_entity(0, 0)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   288
            new_path = self.fspath(cnx, f2)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   289
            new_data = f2.data.getvalue()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   290
            self.assertTrue(osp.isfile(new_path))
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   291
            self.assertEqual(osp.splitext(new_path)[1], '.txt')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   292
            self.assertEqual(old_path, new_path)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   293
            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
   294
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   295
    @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
   296
    def test_bfss_update_to_None(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   297
        with self.admin_access.repo_cnx() as cnx:
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   298
            f = cnx.create_entity('Affaire', opt_attr=Binary(b'toto'))
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   299
            cnx.commit()
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   300
            f.cw_set(opt_attr=None)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   301
            cnx.commit()
7694
bd56a29acaa8 [bfss] Fix update of BFSS attribute to None (close #1875289)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7057
diff changeset
   302
6382
4efd0f07fd53 [test] improve tag for server/test/unittest_storage.py
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6340
diff changeset
   303
    @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
   304
    def test_bfss_update_with_fs_importing(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   305
        with self.admin_access.repo_cnx() as cnx:
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   306
            f1 = cnx.create_entity('File', data=Binary(b'some data'),
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   307
                                   data_format=u'text/plain',
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   308
                                   data_name=u'foo')
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   309
            old_fspath = self.fspath(cnx, f1)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   310
            cnx.transaction_data['fs_importing'] = True
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   311
            new_fspath = osp.join(self.tempdir, 'newfile.txt')
10614
57dfde80df11 [py3k] file → open
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10550
diff changeset
   312
            open(new_fspath, 'w').write('the new data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   313
            cnx.execute('SET F data %(d)s WHERE F eid %(f)s',
10704
73367a56ee41 [py3k] ensure Binary objects are initialized with bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10614
diff changeset
   314
                         {'d': Binary(new_fspath.encode(sys.getfilesystemencoding())), 'f': f1.eid})
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   315
            cnx.commit()
10705
e7eafadbeb15 [py3k] Binary.getvalue() returns bytes
Rémi Cardona <remi.cardona@logilab.fr>
parents: 10704
diff changeset
   316
            self.assertEqual(f1.data.getvalue(), b'the new data')
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   317
            self.assertEqual(self.fspath(cnx, f1), new_fspath)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   318
            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
   319
6383
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   320
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   321
    def test_clean(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   322
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   323
            fsimport = storages.fsimport
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   324
            td = cnx.transaction_data
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   325
            self.assertNotIn('fs_importing', td)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   326
            with fsimport(cnx):
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   327
                self.assertIn('fs_importing', td)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   328
                self.assertTrue(td['fs_importing'])
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   329
            self.assertNotIn('fs_importing', td)
6383
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   330
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   331
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   332
    def test_true(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   333
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   334
            fsimport = storages.fsimport
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   335
            td = cnx.transaction_data
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   336
            td['fs_importing'] = True
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   337
            with fsimport(cnx):
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   338
                self.assertIn('fs_importing', td)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   339
                self.assertTrue(td['fs_importing'])
6383
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   340
            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
   341
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   342
    @tag('fsimport')
19ebe0b994d6 Add a fsimport context manage to localy enable fsimporting.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6382
diff changeset
   343
    def test_False(self):
9783
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   344
        with self.admin_access.repo_cnx() as cnx:
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   345
            fsimport = storages.fsimport
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   346
            td = cnx.transaction_data
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   347
            td['fs_importing'] = False
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   348
            with fsimport(cnx):
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   349
                self.assertIn('fs_importing', td)
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   350
                self.assertTrue(td['fs_importing'])
59c582ce68c8 [tests/storage] use the new connection api
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9267
diff changeset
   351
            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
   352
4967
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   353
if __name__ == '__main__':
236f1fde6dd0 [server] add unit tests for storages
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   354
    unittest_main()