示例#1
0
    def test_create_progressbar(self):
        sess = mock.MagicMock()
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}
        ))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {'progress': i*10}}) for i in range(11)
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)

        class FakeStdout(object):
            writes = []
            def write(self, text):
                self.writes.append(text)
            def flush(self):
                pass

        with mock.patch.object(sys, 'stdout', FakeStdout()):
            c.create({'somedata': 1}, progress_tracker=SimpleTextBarProgressTracking(timeout=None,
                                                                                     interval=0.1))

        # Check we printed the progressbar up to 100%.
        self.assertEqual(''.join(FakeStdout.writes).count('-'),
                         SimpleTextBarProgressTracking.BAR_WIDTH)
示例#2
0
    def test_create_progressbar(self):
        sess = mock.MagicMock()
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}
        ))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {'progress': i*10}}) for i in range(11)
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)

        class FakeStdout(object):
            writes = []
            def write(self, text):
                self.writes.append(text)
            def flush(self):
                pass

        with mock.patch.object(sys, 'stdout', FakeStdout()):
            c.create({'somedata': 1}, progress_tracker=SimpleTextBarProgressTracking(timeout=None,
                                                                                     interval=0.1))

        # Check we printed the progressbar up to 100%.
        self.assertEqual(''.join(FakeStdout.writes).count('-'),
                         SimpleTextBarProgressTracking.BAR_WIDTH)
示例#3
0
    def test_create_timesout_continuation(self):
        sess = mock.MagicMock()
        sess.progress_tracking = DefaultProgressTracking(timeout=0.1,
                                                         interval=0.1)
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {
                'progress': 30
            }}),
            self._mkresp(status_code=200, payload={'value': {
                'progress': 60
            }}),
            self._mkresp(status_code=200, payload={'value': {
                'progress': 100
            }}),
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)

        try:
            c.create({'somedata': 1})
        except TaskProgressTimeoutError as e:
            sess.progress_tracking = DefaultProgressTracking(timeout=None,
                                                             interval=0.1)
            e.entity.wait_progress(e.response)
            self.assertEqual(sess.get.call_count, 3)
        else:
            assert False, "Should have raised TaskProgressTimeoutError"
示例#4
0
    def test_create_waits_for_progress(self):
        sess = mock.MagicMock()
        sess.progress_tracking = DefaultProgressTracking(timeout=1.0,
                                                         interval=0.1)
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {
                'progress': 30
            }}),
            self._mkresp(status_code=200, payload={'value': {
                'progress': 60
            }}),
            self._mkresp(status_code=200, payload={'value': {
                'progress': 100
            }}),
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)
        c.create({'somedata': 1})

        # Assert progress got called until it completed
        self.assertEqual(sess.get.call_count, 3)
示例#5
0
def test_unique_folders_no_secure():
    session = MockSession()
    dataset_url = 'http://host/api/datasets/abc/'
    folders_url = 'http://host/api/datasets/abc/folders/'
    hidden_url = 'http://host/api/datasets/abc/folders/hidden/'
    trash_url = 'http://host/api/datasets/abc/folders/trash/'
    dataset_resource = Entity(session, **{
        "element": "shoji:entity",
        "self": dataset_url,
        "body": {
            "name": "test_dataset_project"
        },
        "catalogs": {
            "folders": folders_url,
        }
    })
    dataset_resource.variables = MagicMock()
    dataset_resource.settings = MagicMock()
    folders_resource = Catalog(session, **{
        "element": "shoji:catalog",
        "self": folders_url,
        "index": {},
        "body": {
            "name": "Root"
        },
        "catalogs": {
            "hidden": hidden_url,
            # Viewer users don't have the secure folder available
            # "secure": secure_url,
            "trash": trash_url,
        }
    })
    hidden_resource = Catalog(session, **{
        "element": "shoji:catalog",
        "self": hidden_url,
        "index": {},
        "body": {
            "name": "Hidden"
        },
    })
    trash_resource = Catalog(session, **{
        "element": "shoji:catalog",
        "self": trash_url,
        "index": {},
        "body": {
            "name": "Trash"
        },
    })
    session.add_fixture(folders_url, folders_resource)
    session.add_fixture(hidden_url, hidden_resource)
    session.add_fixture(trash_url, trash_resource)
    dataset = MutableDataset(dataset_resource)

    assert dataset.folders.root.name == "Root"
    assert dataset.folders.hidden.name == "Hidden"
    assert dataset.folders.trash.name == "Trash"
    assert not hasattr(dataset.folders, "secure")
示例#6
0
 def test_create_does_post_catalog(self):
     sess = mock.MagicMock()
     c = Catalog(self='http://host.com/catalog', session=sess)
     c.create({'somedata': 1})
     sess.post.assert_called_once_with(
         'http://host.com/catalog',
         json.dumps({"somedata": 1, "body": {}, "element": "shoji:entity"}, indent=4),
         headers={'Content-Type': 'application/json'}
     )
示例#7
0
 def test_create_does_post_catalog(self):
     sess = mock.MagicMock()
     c = Catalog(self='http://host.com/catalog', session=sess)
     c.create({'somedata': 1})
     sess.post.assert_called_once_with(
         'http://host.com/catalog',
         json.dumps({"somedata": 1, "body": {}, "element": "shoji:entity"}, indent=None, separators=(',', ':')),
         headers={'Content-Type': 'application/json'}
     )
示例#8
0
 def test_accepts_document_instance(self):
     sess = mock.MagicMock()
     location = 'http://host.com/somewhere'
     sess.post = mock.MagicMock(return_value=self._mkresp(
         status_code=201,
         headers={'Location': location}
     ))
     catalog = Catalog(self='http://host.com/catalog', session=sess)
     body = {
         "name": 'subcatalog'
     }
     sub_catalog = Catalog(session=sess, body=body)
     retval = catalog.create(sub_catalog)
     self.assertEqual(retval.self, location)
     self.assertEqual(retval.body, body)
示例#9
0
 def test_accepts_document_instance(self):
     sess = mock.MagicMock()
     location = 'http://host.com/somewhere'
     sess.post = mock.MagicMock(return_value=self._mkresp(
         status_code=201,
         headers={'Location': location}
     ))
     catalog = Catalog(self='http://host.com/catalog', session=sess)
     body = {
         "name": 'subcatalog'
     }
     sub_catalog = Catalog(session=sess, body=body)
     retval = catalog.create(sub_catalog)
     self.assertEqual(retval.self, location)
     self.assertEqual(retval.body, body)
示例#10
0
    def test_detect_correct_handler(self):
        session = Mock(feature_flags={'old_projects_order': True})
        dataset_order = Order(session, **{'graph': []})
        datasets_catalog = Catalog(session, **{
            'index': {},
            'order': dataset_order
        })
        shoji_resource = Entity(
            session, **{
                'self': '/project/url/',
                'body': {},
                'index': {},
                'datasets': datasets_catalog
            })
        project = Project(shoji_resource)
        self.assertTrue(isinstance(project.order, ProjectDatasetsOrder))

        session = Mock(feature_flags={'old_projects_order': False})
        shoji_resource = Entity(
            session, **{
                'self': '/project/url/',
                'body': {},
                'index': {},
                'graph': []
            })
        project = Project(shoji_resource)
        self.assertTrue(isinstance(project.order, Project))
示例#11
0
    def test_create_waits_for_progress(self):
        sess = mock.MagicMock()
        sess.progress_tracking = DefaultProgressTracking(timeout=1.0, interval=0.1)
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}
        ))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {'progress': 30}}),
            self._mkresp(status_code=200, payload={'value': {'progress': 60}}),
            self._mkresp(status_code=200, payload={'value': {'progress': 100}}),
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)
        c.create({'somedata': 1})

        # Assert progress got called until it completed
        self.assertEqual(sess.get.call_count, 3)
示例#12
0
    def test_void_catalog_create(self):
        sess = mock.MagicMock()
        c = Catalog(self='http://host.com/catalog', session=sess)
        things_url = "http://host.com/catalog/things"
        c["catalogs"] = {"things": things_url}

        # void_catalog...
        things = c.void("things")
        # ...MUST NOT call GET...
        sess.get.assert_not_called()
        # ...MUST return a dummy Catalog...
        assert things.__class__ == Catalog
        assert things.self == things_url
        assert things.session is c.session
        assert dict(things) == {"element": "shoji:catalog", "self": things_url}

        # ...MUST have a working `create` method...
        things.create({'somedata': 1})
        sess.post.assert_called_once_with(
            'http://host.com/catalog/things',
            json.dumps({"somedata": 1, "body": {}, "element": "shoji:entity"}, indent=None, separators=(',', ':')),
            headers={'Content-Type': 'application/json'}
        )
示例#13
0
    def create_folder(self, folder_name, position=None, after=None, before=None, alias=None):
        new_ent = self.folder_ent.create(Catalog(self.folder_ent.session, body={
            'name': folder_name
        }))
        new_ent.refresh()
        subfolder = Folder(new_ent, self.root, self)
        if position is not None or after is not None or before is not None:
            children = self._position_items([subfolder], position, before, after)
            self.reorder(children)

        if alias:
            subfolder.move_here(alias)

        self.folder_ent.refresh()
        return subfolder
示例#14
0
    def test_create_raises_failures(self):
        sess = mock.MagicMock()
        sess.progress_tracking = DefaultProgressTracking(timeout=1.0, interval=0.1)
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}
        ))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {'progress': -1,
                                                             'message': 'Some Failure'}}),
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)
        self.assertRaises(TaskError, c.create, {'somedata': 1})
示例#15
0
    def test_create_timesout_continuation(self):
        sess = mock.MagicMock()
        sess.progress_tracking = DefaultProgressTracking(timeout=0.1, interval=0.1)
        sess.post = mock.MagicMock(return_value=self._mkresp(
            status_code=202,
            headers={'Location': 'http://host.com/somewhere'},
            payload={"value": 'http://host.com/progress/1'}
        ))
        sess.get = mock.MagicMock(side_effect=[
            self._mkresp(status_code=200, payload={'value': {'progress': 30}}),
            self._mkresp(status_code=200, payload={'value': {'progress': 60}}),
            self._mkresp(status_code=200, payload={'value': {'progress': 100}}),
        ])

        c = Catalog(self='http://host.com/catalog', session=sess)

        try:
            c.create({'somedata': 1})
        except TaskProgressTimeoutError as e:
            sess.progress_tracking = DefaultProgressTracking(timeout=None, interval=0.1)
            e.entity.wait_progress(e.response)
            self.assertEqual(sess.get.call_count, 3)
        else:
            assert False, "Should have raised TaskProgressTimeoutError"
示例#16
0
def test_unique_folders_no_hidden():
    session = MockSession()
    dataset_url = 'http://host/api/datasets/abc/'
    folders_url = 'http://host/api/datasets/abc/folders/'
    dataset_resource = Entity(session, **{
        "element": "shoji:entity",
        "self": dataset_url,
        "body": {
            "name": "test_dataset_project"
        },
        "catalogs": {
            "folders": folders_url,
        }
    })
    dataset_resource.variables = MagicMock()
    dataset_resource.settings = MagicMock()
    folders_resource = Catalog(session, **{
        "element": "shoji:catalog",
        "self": folders_url,
        "index": {},
        "body": {
            "name": "Root"
        },
        "catalogs": {
            # Standard exposed catalogs
            "personal": "./personal/",
            "parents": "./parents/",
            # Viewer users don't have the secure folder available
            # "secure": secure_url,
            # Viewers also don't get the hidden folder exposed
            # "hidden": hidden_url,
            # Nor the trash
            # "trash": trash_url,
        }
    })
    session.add_fixture(folders_url, folders_resource)
    dataset = MutableDataset(dataset_resource)

    assert dataset.folders.root.name == "Root"
    assert not hasattr(dataset.folders, "secure")
    assert not hasattr(dataset.folders, "hidden")
    assert not hasattr(dataset.folders, "trash")
示例#17
0
def setup_folders(ds):
    sess = ds.session
    ds.settings.edit(variable_folders=True)
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar1', 'type': 'numeric'}
    })
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar2', 'type': 'numeric'}
    })
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar3', 'type': 'numeric'}
    })
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar4', 'type': 'numeric'}
    })
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar5', 'type': 'numeric'}
    })
    ds.variables.create({
        'element': 'shoji:entity',
        'body': {'name': 'testvar6', 'type': 'numeric'}
    })
    ds.refresh()
    sf1 = Catalog(sess, body={
        'name': 'Subfolder 1'
    })
    sf1 = ds.folders.create(sf1)
    sfa = Catalog(sess, body={
        'name': 'Subfolder A'
    })
    sfa = sf1.create(sfa)
    sf2 = Catalog(sess, body={
            'name': 'Subfolder 2'
        })
    sf2 = ds.folders.create(sf2)
    variables = ds.variables.by('alias')
    sf1.patch({'index': {
        variables['age'].entity_url: {}
    }})
    sfa.patch({'index': {
        variables['gender'].entity_url: {}
    }})
    sf2.patch({'index': {
        variables['socialmedia'].entity_url: {}
    }})