Refactor API helpers for re-use in rest of test framework.

- Move api.helpers to base.populators.
- Refactor helper subclasses adapted to use bioblend instead of test framework stuff into base.populators for greater visibility.
- Refactor workflow format 2 testing stuff for reuse by Selenium.
This commit is contained in:
John Chilton
2017-01-08 08:13:42 -05:00
parent dad4c60d85
commit de35c85b65
30 changed files with 85 additions and 77 deletions
+1 -2
View File
@@ -1,8 +1,7 @@
import json
from base import api
from .helpers import DatasetCollectionPopulator, DatasetPopulator
from base.populators import DatasetCollectionPopulator, DatasetPopulator
class DatasetCollectionApiTestCase( api.ApiTestCase ):
+1 -2
View File
@@ -3,8 +3,7 @@ from __future__ import print_function
import textwrap
from base import api
from .helpers import TestsDatasets
from base.populators import TestsDatasets
class DatasetsApiTestCase( api.ApiTestCase, TestsDatasets ):
+1 -1
View File
@@ -8,7 +8,7 @@ from requests import (
from base import api
from .helpers import DatasetPopulator, wait_on
from base.populators import DatasetPopulator, wait_on
class HistoriesApiTestCase( api.ApiTestCase ):
+1 -2
View File
@@ -5,8 +5,7 @@ import json
from requests import delete, put
from base import api
from .helpers import DatasetCollectionPopulator, LibraryPopulator, TestsDatasets
from base.populators import DatasetCollectionPopulator, LibraryPopulator, TestsDatasets
# TODO: Test anonymous access.
+1 -2
View File
@@ -1,6 +1,5 @@
from base import api
from .helpers import DatasetPopulator
from base.populators import DatasetPopulator
class TestProvenance( api.ApiTestCase ):
+1 -2
View File
@@ -4,8 +4,7 @@ import time
from operator import itemgetter
from base import api
from .helpers import TestsDatasets
from base.populators import TestsDatasets
class JobsApiTestCase( api.ApiTestCase, TestsDatasets ):
+1 -2
View File
@@ -1,6 +1,5 @@
from base import api
from .helpers import (
from base.populators import (
LibraryPopulator,
TestsDatasets,
wait_on_state
+1 -2
View File
@@ -1,8 +1,7 @@
from base import api
from base.populators import WorkflowPopulator
from requests import delete
from .helpers import WorkflowPopulator
class SearchApiTestCase( api.ApiTestCase ):
+6 -3
View File
@@ -2,11 +2,14 @@
import json
from base import api
from base.populators import (
DatasetCollectionPopulator,
DatasetPopulator,
LibraryPopulator,
skip_without_tool
)
from galaxy.tools.verify.test_data import TestDataResolver
from .helpers import (DatasetCollectionPopulator, DatasetPopulator,
LibraryPopulator, skip_without_tool)
class ToolsTestCase( api.ApiTestCase ):
+2 -1
View File
@@ -5,7 +5,8 @@ import operator
from collections import namedtuple
from json import dumps, loads
from .helpers import skip_without_tool
from base.populators import skip_without_tool
from .test_workflows import BaseWorkflowsApiTestCase
+9 -7
View File
@@ -9,12 +9,16 @@ import yaml
from requests import delete, put
from base import api
from base.populators import (
DatasetCollectionPopulator,
DatasetPopulator,
skip_without_tool,
WorkflowPopulator
)
from galaxy.exceptions import error_codes
from galaxy.tools.verify.test_data import TestDataResolver
from .helpers import (DatasetCollectionPopulator, DatasetPopulator,
skip_without_tool, WorkflowPopulator)
from .workflows_format_2 import (
from base.workflows_format_2 import (
convert_and_import_workflow,
ImporterGalaxyInterface,
)
@@ -1216,11 +1220,9 @@ test_data:
def test_workflow_stability( self ):
# Run this index stability test with following command:
# ./run_tests.sh test/api/test_workflows.py:WorkflowsApiTestCase.test_workflow_stability
from pkg_resources import resource_string
num_tests = 1
for workflow_file in [ "test_workflow_topoambigouity.ga", "test_workflow_topoambigouity_auto_laidout.ga" ]:
workflow_str = resource_string( __name__, workflow_file )
workflow = self.workflow_populator.load_workflow( "test1", content=workflow_str )
for workflow_file in [ "test_workflow_topoambigouity", "test_workflow_topoambigouity_auto_laidout" ]:
workflow = self.workflow_populator.load_workflow_from_resource( workflow_file )
last_step_map = self._step_map( workflow )
for i in range(num_tests):
uploaded_workflow_id = self.workflow_populator.create_workflow( workflow )
@@ -1,17 +1,20 @@
import json
import time
from operator import itemgetter
import requests
from pkg_resources import resource_string
from six import StringIO
from base import api_asserts
# Simple workflow that takes an input and call cat wrapper on it.
workflow_str = resource_string( __name__, "test_workflow_1.ga" )
workflow_str = resource_string( __name__, "data/test_workflow_1.ga" )
# Simple workflow that takes an input and filters with random lines twice in a
# row - first grabbing 8 lines at random and then 6.
workflow_random_x2_str = resource_string( __name__, "test_workflow_2.ga" )
workflow_random_x2_str = resource_string( __name__, "data/test_workflow_2.ga" )
DEFAULT_TIMEOUT = 15 # Secs to wait for state to turn ok
@@ -229,7 +232,7 @@ class BaseWorkflowPopulator( object ):
def load_workflow_from_resource( self, name, filename=None ):
if filename is None:
filename = "%s.ga" % name
filename = "data/%s.ga" % name
content = resource_string( __name__, filename )
return self.load_workflow( name, content=content )
@@ -476,6 +479,54 @@ def wait_on_state( state_func, assert_ok=False, timeout=DEFAULT_TIMEOUT ):
return wait_on( get_state, desc="state", timeout=timeout)
class GiPostGetMixin:
"""Mixin for adapting Galaxy testing populators helpers to bioblend."""
def _get(self, route):
return self._gi.make_get_request(self.__url(route))
def _post(self, route, data={}):
data = data.copy()
data['key'] = self._gi.key
return requests.post(self.__url(route), data=data)
def __url(self, route):
return self._gi.url + "/" + route
class GiDatasetPopulator(BaseDatasetPopulator, GiPostGetMixin):
"""Implementation of BaseDatasetPopulator backed by bioblend."""
def __init__(self, gi):
"""Construct a dataset populator from a bioblend GalaxyInstance."""
self._gi = gi
class GiDatasetCollectionPopulator(BaseDatasetCollectionPopulator, GiPostGetMixin):
"""Implementation of BaseDatasetCollectionPopulator backed by bioblend."""
def __init__(self, gi):
"""Construct a dataset collection populator from a bioblend GalaxyInstance."""
self._gi = gi
self.dataset_populator = GiDatasetPopulator(gi)
def _create_collection(self, payload):
create_response = self._post( "dataset_collections", data=payload )
return create_response
class GiWorkflowPopulator(BaseWorkflowPopulator, GiPostGetMixin):
"""Implementation of BaseWorkflowPopulator backed by bioblend."""
def __init__(self, gi):
"""Construct a workflow populator from a bioblend GalaxyInstance."""
self._gi = gi
self.dataset_populator = GiDatasetPopulator(gi)
def wait_on( function, desc, timeout=DEFAULT_TIMEOUT ):
delta = .25
iteration = 0
+5 -47
View File
@@ -14,13 +14,16 @@ from argparse import ArgumentParser
from threading import Thread
from uuid import uuid4
import requests
from bioblend import galaxy
galaxy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))
sys.path[1:1] = [ os.path.join( galaxy_root, "lib" ), os.path.join( galaxy_root, "test" ) ]
from api import helpers
from base.populators import (
GiDatasetCollectionPopulator,
GiDatasetPopulator,
GiWorkflowPopulator,
)
from api.workflows_format_2.converter import python_to_workflow
LONG_TIMEOUT = 1000000000
@@ -109,51 +112,6 @@ def _run(args, gi, workflow_id, uuid):
)
class GiPostGetMixin:
"""Mixin for adapting Galaxy API testing helpers to bioblend."""
def _get(self, route):
return self._gi.make_get_request(self.__url(route))
def _post(self, route, data={}):
data = data.copy()
data['key'] = self._gi.key
return requests.post(self.__url(route), data=data)
def __url(self, route):
return self._gi.url + "/" + route
class GiDatasetPopulator(helpers.BaseDatasetPopulator, GiPostGetMixin):
"""Utility class for dealing with datasets and histories."""
def __init__(self, gi):
"""Construct a dataset populator from a bioblend GalaxyInstance."""
self._gi = gi
class GiDatasetCollectionPopulator(helpers.BaseDatasetCollectionPopulator, GiPostGetMixin):
"""Utility class for dealing with dataset collections."""
def __init__(self, gi):
"""Construct a dataset collection populator from a bioblend GalaxyInstance."""
self._gi = gi
self.dataset_populator = GiDatasetPopulator(gi)
def _create_collection(self, payload):
create_response = self._post( "dataset_collections", data=payload )
return create_response
class GiWorkflowPopulator(helpers.BaseWorkflowPopulator, GiPostGetMixin):
"""Utility class for dealing with workflows."""
def __init__(self, gi):
"""Construct a workflow populator from a bioblend GalaxyInstance."""
self._gi = gi
self.dataset_populator = GiDatasetPopulator(gi)
def _workflow_struct(args, input_uuid):
if args.two_outputs:
return _workflow_struct_two_outputs(args, input_uuid)