Skip to content

Commit

Permalink
Merge branch 'feature/test-v1-api-server' into develop
Browse files Browse the repository at this point in the history
 [SVCS-377]
 Closes: #239
  • Loading branch information
felliott committed Jun 4, 2018
2 parents 641ccae + 15e7457 commit 5c637a2
Show file tree
Hide file tree
Showing 10 changed files with 1,112 additions and 202 deletions.
8 changes: 4 additions & 4 deletions tests/core/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ def test_file_json_api_serialize(self):
'materialized': '/Foo.name',
'etag': etag,
'contentType': 'application/octet-stream',
'modified': 'never',
'modified_utc': 'never',
'modified': '9/25/2017',
'modified_utc': '1991-09-25T19:20:30.45+01:00',
'created_utc': 'always',
'size': 1337,
'sizeInt': 1337,
Expand Down Expand Up @@ -90,8 +90,8 @@ def test_folder_json_api_size_serialize(self):
'materialized': '/Foo.name',
'etag': etag,
'contentType': 'application/octet-stream',
'modified': 'never',
'modified_utc': 'never',
'modified': '9/25/2017',
'modified_utc': '1991-09-25T19:20:30.45+01:00',
'created_utc': 'always',
'size': 1337,
'sizeInt': 1337,
Expand Down
273 changes: 273 additions & 0 deletions tests/server/api/v1/fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,273 @@
import os
import sys
import json
import asyncio
from unittest import mock

import pytest
from tornado.web import HTTPError
from tornado.httputil import HTTPServerRequest
from tornado.http1connection import HTTP1ConnectionParameters

import waterbutler
from waterbutler.server.app import make_app
from waterbutler.core.path import WaterButlerPath
from waterbutler.tasks.exceptions import WaitTimeOutError
from waterbutler.server.api.v1.provider import ProviderHandler
from tests.utils import (MockProvider, MockFileMetadata, MockFolderMetadata,
MockFileRevisionMetadata, MockCoroutine, MockRequestBody, MockStream)


@pytest.fixture
def http_request():
mocked_http_request = HTTPServerRequest(
uri='/v1/resources/test/providers/test/path/mock',
method='GET'
)
mocked_http_request.headers['User-Agent'] = 'test'
mocked_http_request.connection = HTTP1ConnectionParameters()
mocked_http_request.connection.set_close_callback = mock.Mock()
mocked_http_request.request_time = mock.Mock(return_value=10)
mocked_http_request.body = MockRequestBody()
return mocked_http_request


@pytest.fixture
def handler(http_request):
mocked_handler = ProviderHandler(make_app(True), http_request)

mocked_handler.path_kwargs = {
'provider': 'test',
'path': '/file',
'resource': 'guid1'
}
mocked_handler.path = '/test_path'
mocked_handler.provider = MockProvider()

mocked_handler.resource = 'test_source_resource'
mocked_handler.metadata = MockFileMetadata()

mocked_handler.dest_path = '/test_dest_path'
mocked_handler.dest_provider = MockProvider()
mocked_handler.dest_resource = 'test_dest_resource'
mocked_handler.dest_meta = MockFileMetadata()
mocked_handler.arguments = {}
mocked_handler.write = mock.Mock()
mocked_handler.write_stream = MockCoroutine()
mocked_handler.redirect = mock.Mock()
mocked_handler.uploader = asyncio.Future()
mocked_handler.wsock = mock.Mock()
mocked_handler.writer = mock.Mock()

return mocked_handler


@pytest.fixture
def mock_stream():
return MockStream()


@pytest.fixture
def mock_partial_stream():
stream = MockStream()
stream.partial = True
stream.content_range = 'bytes=10-100'
return stream


@pytest.fixture()
def mock_file_metadata():
return MockFileMetadata()


@pytest.fixture()
def mock_folder_metadata():
return MockFolderMetadata()


@pytest.fixture()
def mock_revision_metadata():
return [MockFileRevisionMetadata()]


@pytest.fixture()
def mock_folder_children():
return [MockFolderMetadata(), MockFileMetadata(), MockFileMetadata()]


@pytest.fixture
def patch_auth_handler(monkeypatch, handler_auth):
mock_auth_handler = MockCoroutine(return_value=handler_auth)
monkeypatch.setattr(waterbutler.server.auth.AuthHandler, 'get', mock_auth_handler)
return mock_auth_handler


@pytest.fixture
def patch_make_provider_move_copy(monkeypatch):
make_provider = mock.Mock(return_value=MockProvider())
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy, 'make_provider', make_provider)
return make_provider


@pytest.fixture
def patch_make_provider_core(monkeypatch):
make_provider = mock.Mock(return_value=MockProvider())
monkeypatch.setattr(waterbutler.server.api.v1.provider.utils, 'make_provider', make_provider)
return make_provider


@pytest.fixture(params=[True, False])
def mock_intra(monkeypatch, request):
src_provider = MockProvider()
dest_provider = MockProvider()
mock_make_provider = mock.Mock(side_effect=[src_provider, dest_provider])
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy,
'make_provider',
mock_make_provider)

src_provider.can_intra_copy = mock.Mock(return_value=True)
src_provider.can_intra_move = mock.Mock(return_value=True)

mock_backgrounded = MockCoroutine(return_value=(MockFileMetadata(), request.param))
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy.tasks,
'backgrounded',
mock_backgrounded)

return mock_make_provider, mock_backgrounded


@pytest.fixture(params=[True, False])
def mock_inter(monkeypatch, request):
src_provider = MockProvider()
dest_provider = MockProvider()
mock_make_provider = mock.Mock(side_effect=[src_provider, dest_provider])
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy,
'make_provider',
mock_make_provider)

mock_celery = MockCoroutine(return_value=(MockFileMetadata(), request.param))
mock_adelay = MockCoroutine(return_value='4ef2d1dd-c5da-41a7-ae4a-9d0ba7a68927')
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy.tasks.copy,
'adelay',
mock_adelay)
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy.tasks.move,
'adelay',
mock_adelay)
monkeypatch.setattr(waterbutler.server.api.v1.provider.movecopy.tasks,
'wait_on_celery',
mock_celery)

return mock_make_provider, mock_adelay


@pytest.fixture
def mock_exc_info():
try:
raise Exception('test exception')
except:
return sys.exc_info()


@pytest.fixture
def mock_exc_info_http():
try:
raise HTTPError(status_code=500, log_message='test http exception')
except HTTPError:
return sys.exc_info()


@pytest.fixture
def mock_exc_info_202():
try:
raise WaitTimeOutError('test exception')
except WaitTimeOutError:
return sys.exc_info()


@pytest.fixture
def move_copy_args():
return (
{
'nid': 'test_source_resource',
'provider': {
'credentials': {},
'name': 'MockProvider',
'auth': {},
'settings': {}
},
'path': '/test_path'
},
{
'nid': 'test_dest_resource',
'provider': {
'credentials': {},
'name': 'MockProvider',
'auth': {},
'settings': {}
}, 'path': '/test_dest_path'
}
)


@pytest.fixture
def celery_src_copy_params():
return {
'nid': 'test_source_resource',
'path': WaterButlerPath('/test_path', prepend=None),
'provider': {
'credentials': {},
'name': 'MockProvider',
'settings': {},
'auth': {}
}
}


@pytest.fixture
def celery_dest_copy_params():
return {
'nid': 'test_source_resource',
'path': WaterButlerPath('/test_path/', prepend=None),
'provider': {
'credentials': {},
'name': 'MockProvider',
'settings': {},
'auth': {}
}
}


@pytest.fixture
def celery_dest_copy_params_root():
return {
'nid': 'test_source_resource',
'path': WaterButlerPath('/', prepend=None),
'provider': {
'credentials': {},
'name': 'MockProvider',
'settings': {},
'auth': {}
}
}


@pytest.fixture
def handler_auth():
with open(os.path.join(os.path.dirname(__file__), 'fixtures/fixtures.json'), 'r') as fp:
return json.load(fp)['hander_auth']


@pytest.fixture
def serialized_metadata():
with open(os.path.join(os.path.dirname(__file__), 'fixtures/fixtures.json'), 'r') as fp:
return json.load(fp)['serialized_metadata']


@pytest.fixture
def serialized_request():
with open(os.path.join(os.path.dirname(__file__), 'fixtures/fixtures.json'), 'r') as fp:
return json.load(fp)['serialized_request']




89 changes: 89 additions & 0 deletions tests/server/api/v1/fixtures/fixtures.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
{
"hander_auth": {
"callback_url": "http://192.168.168.167:5000/api/v1/project/fmsaw/waterbutler/logs/",
"credentials": {
"storage": {}
},
"settings": {
"rootId": "5a4be6acfc93fd00108dab0c",
"nid": "fmsaw",
"storage": {
"folder": "/code/website/osfstoragecache",
"provider": "test"
},
"folder": "/folder/",
"baseUrl": "http://192.168.168.167:5000/api/v1/project/fmsaw/osfstorage/"
},
"auth": {
"callback_url": "http://192.168.168.167:5000/api/v1/project/fmsaw/waterbutler/logs/",
"name": "fake",
"id": "3jc7m",
"email": "3jc7m@osf.io"
}
},
"serialized_metadata": {
"data": {
"attributes": {
"contentType": "application/octet-stream",
"materialized": "/Foo.name",
"created_utc": "always",
"etag": "4ac022b0d4aa61eca8f5e114013a740f784b7d72f237fce49b305d5c95278f64",
"modified": "9/25/2017",
"extra": {},
"modified_utc": "1991-09-25T19:20:30.45+01:00",
"kind": "file",
"resource": "test_source_resource",
"size": 1337,
"sizeInt": 1337,
"name": "Foo.name",
"path": "/Foo.name",
"provider": "MockProvider"
},
"id": "MockProvider/Foo.name",
"links": {
"download": "http://localhost:7777/v1/resources/test_source_resource/providers/MockProvider/Foo.name",
"delete": "http://localhost:7777/v1/resources/test_source_resource/providers/MockProvider/Foo.name",
"upload": "http://localhost:7777/v1/resources/test_source_resource/providers/MockProvider/Foo.name?kind=file",
"move": "http://localhost:7777/v1/resources/test_source_resource/providers/MockProvider/Foo.name"
},
"type": "files"
}
},
"serialized_request": {
"referrer": {
"url": null
},
"tech": {
"ip": null,
"ua": "test"
},
"request": {
"headers": {},
"method": "GET",
"url": "http://127.0.0.1/v1/resources/test/providers/test/path/mock",
"time": 10
}
},
"move_copy_args": [
{
"nid": "test_source_resource",
"provider": {
"credentials": {},
"name": "MockProvider",
"auth": {},
"settings": {}
},
"path": "/test_path"
},
{
"nid": "test_dest_resource",
"provider": {
"credentials": {},
"name": "MockProvider",
"auth": {},
"settings": {}
},
"path": "/test_dest_path"
}
]
}

0 comments on commit 5c637a2

Please sign in to comment.