From 858349cb635be1bbd47dfcffdf291414d373a91e Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Wed, 22 Sep 2010 16:38:49 -0400 Subject: [PATCH] Rewrite the functional tests that cover all Galaxy forms related behavior. Clean up / fix bugs in several sample run request templates. Fix a bug introduced in change set a8cdece11998 which incorrectly generated selected options in a select list in the data library framework. --- lib/galaxy/web/controllers/forms.py | 4 +- lib/galaxy/web/controllers/library_common.py | 9 +- lib/galaxy/web/controllers/requests_common.py | 31 +- templates/admin/forms/edit_form.mako | 4 +- templates/requests/common/show_request.mako | 712 ++++++++---------- test/base/test_db_util.py | 4 +- test/base/twilltestcase.py | 481 ++++++------ test/functional/test_forms_and_requests.py | 412 +++++----- test/functional/test_library_features.py | 16 +- test/functional/test_library_security.py | 24 +- test/functional/test_library_templates.py | 38 +- test/functional/test_user_info.py | 218 +++--- 12 files changed, 966 insertions(+), 987 deletions(-) diff --git a/lib/galaxy/web/controllers/forms.py b/lib/galaxy/web/controllers/forms.py index 41bfb77c164..ed4c1383b4a 100644 --- a/lib/galaxy/web/controllers/forms.py +++ b/lib/galaxy/web/controllers/forms.py @@ -107,9 +107,7 @@ class Forms( BaseController ): return trans.fill_template( '/admin/forms/show_form_read_only.mako', form=fdc.latest_form ) def __form_types_widget(self, trans, selected='none'): - form_type_selectbox = SelectField( 'form_type_selectbox', - refresh_on_change=True, - refresh_on_change_values=[trans.app.model.FormDefinition.types.SAMPLE] ) + form_type_selectbox = SelectField( 'form_type_selectbox' ) if selected == 'none': form_type_selectbox.add_option('Select one', 'none', selected=True) else: diff --git a/lib/galaxy/web/controllers/library_common.py b/lib/galaxy/web/controllers/library_common.py index aff3726e7bc..d721658c20f 100644 --- a/lib/galaxy/web/controllers/library_common.py +++ b/lib/galaxy/web/controllers/library_common.py @@ -906,7 +906,7 @@ class LibraryCommon( BaseController, UsesFormDefinitionWidgets ): else: action = web.url_for( controller='library_common', action='upload_library_dataset' ) upload_option_select_list = self._build_upload_option_select_list( trans, upload_option ) - roles_select_list = self._build_roles_select_list( trans, cntrller, library, roles ) + roles_select_list = self._build_roles_select_list( trans, cntrller, library, util.listify( roles ) ) return trans.fill_template( '/library/common/upload.mako', cntrller=cntrller, upload_option_select_list=upload_option_select_list, @@ -1252,7 +1252,7 @@ class LibraryCommon( BaseController, UsesFormDefinitionWidgets ): trans.sa_session.refresh( history ) action = 'add_history_datasets_to_library' upload_option_select_list = self._build_upload_option_select_list( trans, upload_option ) - roles_select_list = self._build_roles_select_list( trans, cntrller, library, roles ) + roles_select_list = self._build_roles_select_list( trans, cntrller, library, util.listify( roles ) ) return trans.fill_template( "/library/common/upload.mako", cntrller=cntrller, upload_option_select_list=upload_option_select_list, @@ -1273,7 +1273,7 @@ class LibraryCommon( BaseController, UsesFormDefinitionWidgets ): ldda_message=ldda_message, message=message, status=status ) - def _build_roles_select_list( self, trans, cntrller, library, selected_roles ): + def _build_roles_select_list( self, trans, cntrller, library, selected_role_ids=[] ): # Get the list of legitimate roles to display on the upload form. If the library is public, # all active roles are legitimate. If the library is restricted by the LIBRARY_ACCESS permission, only # the set of all roles associated with users that have that permission are legitimate. @@ -1283,7 +1283,8 @@ class LibraryCommon( BaseController, UsesFormDefinitionWidgets ): # were selected before refresh_on_change, if one occurred. roles_select_list = SelectField( "roles", multiple="true", size="5" ) for role in legitimate_roles: - roles_select_list.add_option( text=role.name, value=str( role.id ), selected=str( role.id ) in selected_roles ) + selected = str( role.id ) in selected_role_ids + roles_select_list.add_option( text=role.name, value=str( role.id ), selected=selected ) return roles_select_list else: return None diff --git a/lib/galaxy/web/controllers/requests_common.py b/lib/galaxy/web/controllers/requests_common.py index 14c13b21f8d..7b293dcf330 100644 --- a/lib/galaxy/web/controllers/requests_common.py +++ b/lib/galaxy/web/controllers/requests_common.py @@ -158,6 +158,8 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): for user in user_list: if not user.deleted: user_ids.append(str(user.id)) + # gvk - 9/22/10: TODO: why does select_user require a refresh_on_change? Nothing in the + # code is apparent as to why this is done. select_user = SelectField('select_user', refresh_on_change=True, refresh_on_change_values=user_ids[1:]) @@ -830,24 +832,24 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): current_samples, details, edit_mode, libraries = self.__update_samples( trans, request, **kwd ) selected_samples = self.__selected_samples(trans, request, **kwd) sample_ops = self.__sample_operation_selectbox(trans, request,**kwd) - if params.get('select_sample_operation', 'none') != 'none' and not len(selected_samples): + if params.get( 'select_sample_operation', False ) and not selected_samples: return trans.response.send_redirect( web.url_for( controller=cntrller, action='list', operation='show', id=trans.security.encode_id(request.id), status='error', message='Select at least one sample before selecting an operation.' )) - if params.get('import_samples_button', False) == 'Import samples': + if params.get( 'import_samples_button', False ): return self.__import_samples(trans, cntrller, request, current_samples, details, libraries, **kwd) - elif params.get('add_sample_button', False) == 'Add New': + elif params.get('add_sample_button', False ): # add an empty or filled sample # if the user has selected a sample no. to copy then copy the contents # of the src sample to the new sample else an empty sample - src_sample_index = int(params.get( 'copy_sample', -1 )) + src_sample_index = int(params.get( 'copy_sample', -1 ) ) # get the number of new copies of the src sample - num_sample_to_copy = int(params.get( 'num_sample_to_copy', 1 )) + num_sample_to_copy = int( params.get( 'num_sample_to_copy', 1 ) ) if src_sample_index == -1: - for ns in range(num_sample_to_copy): + for ns in range( num_sample_to_copy ): # empty sample lib_widget, folder_widget = self.__library_widgets(trans, request.user, len(current_samples), @@ -882,10 +884,11 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): request_details=self.request_details(trans, request.id), current_samples=current_samples, sample_copy=self.__copy_sample(current_samples), - details=details, selected_samples=selected_samples, + details=details, + selected_samples=selected_samples, sample_ops=sample_ops, edit_mode=edit_mode) - elif params.get('save_samples_button', False) == 'Save': + elif params.get( 'save_samples_button', False ): # check for duplicate sample names message = '' for index in range(len(current_samples)-len(request.samples)): @@ -974,7 +977,7 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): id=trans.security.encode_id(request.id), status=status, message=message )) - elif params.get('edit_samples_button', False) == 'Edit samples': + elif params.get( 'edit_samples_button', False ): edit_mode = 'True' return trans.fill_template( '/requests/common/show_request.mako', cntrller=cntrller, @@ -985,12 +988,12 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): sample_ops=sample_ops, details=details, libraries=libraries, edit_mode=edit_mode) - elif params.get('cancel_changes_button', False) == 'Cancel': + elif params.get( 'cancel_changes_button', False ): return trans.response.send_redirect( web.url_for( controller=cntrller, action='list', operation='show', id=trans.security.encode_id(request.id)) ) - elif params.get('change_state_button', False) == 'Save': + elif params.get( 'change_state_button', False ) == 'Save': comments = util.restore_text( params.comment ) selected_state = int( params.select_state ) new_state = trans.sa_session.query( trans.app.model.SampleState ).get( selected_state ) @@ -1003,12 +1006,12 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): cntrller=cntrller, action='update_request_state', request_id=request.id )) - elif params.get('change_state_button', False) == 'Cancel': + elif params.get( 'change_state_button', False ) == 'Cancel': return trans.response.send_redirect( web.url_for( controller=cntrller, action='list', operation='show', id=trans.security.encode_id(request.id)) ) - elif params.get('change_lib_button', False) == 'Save': + elif params.get( 'change_lib_button', False ) == 'Save': library = trans.sa_session.query( trans.app.model.Library ).get( int( params.get( 'sample_0_library_id', None ) ) ) folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( int( params.get( 'sample_0_folder_id', None ) ) ) for sample_id in selected_samples: @@ -1023,7 +1026,7 @@ class RequestsCommon( BaseController, UsesFormDefinitionWidgets ): id=trans.security.encode_id(request.id), status='done', message='Changes made to the selected sample(s) are saved. ') ) - elif params.get('change_lib_button', False) == 'Cancel': + elif params.get( 'change_lib_button', False ) == 'Cancel': return trans.response.send_redirect( web.url_for( controller=cntrller, action='list', operation='show', diff --git a/templates/admin/forms/edit_form.mako b/templates/admin/forms/edit_form.mako index f80ae60f099..90696d12be0 100644 --- a/templates/admin/forms/edit_form.mako +++ b/templates/admin/forms/edit_form.mako @@ -59,12 +59,10 @@ $(document).ready(function(){ %for i, option in enumerate(options):
${i+1} - ${option[1].get_html()} - ##Remove
+ ${option[1].get_html()}
%endfor -
diff --git a/templates/requests/common/show_request.mako b/templates/requests/common/show_request.mako index 44eb4105c63..4f4611f720e 100644 --- a/templates/requests/common/show_request.mako +++ b/templates/requests/common/show_request.mako @@ -1,165 +1,162 @@ -<%inherit file="/base.mako"/> <%namespace file="/message.mako" import="render_msg" /> <%namespace file="/requests/common/sample_state.mako" import="render_sample_state" /> <%namespace file="/requests/common/sample_datasets.mako" import="render_sample_datasets" /> +<%! + def inherit(context): + if context.get('use_panels'): + return '/webapps/galaxy/base_panels.mako' + else: + return '/base.mako' +%> +<%inherit file="${inherit(context)}"/> +<%def name="stylesheets()"> + ${parent.stylesheets()} + ${h.css( "library" )} + - - - - - - - - - - - - + document.onkeypress = stopRKey + + <% samples_not_ready = request.sequence_run_ready() %> %if samples_not_ready: @@ -187,244 +184,218 @@ $(document).ready(function(){ | State: ${request.state()} %endif
- -
-
+ +

+ - - -
-

Show Request Information

-
- - - - - - - -
-
- - %if request.desc: - ${request.desc} - %else: - None - %endif -
-
- %for index, rd in enumerate(request_details): -
- - %if not rd['value']: - None - %else: - %if rd['label'] == 'State': - ${rd['value']} - %else: - ${rd['value']} - %endif - %endif -
-
- %endfor -
-
- - ${request.create_time} -
-
- - ${request.update_time} -
-
- - <% emails = ', '.join(request.notification['email']) %> - %if emails: - ${emails} - %else: - None - %endif -
-
-
- - <% - states = [] - for ss in request.type.states: - if ss.id in request.notification['sample_states']: - states.append(ss.name) - states = ', '.join(states) - %> - %if states: - ${states} - %else: - None - %endif -
-
-
- -
-
- -
- -##
-
- ##
- %if current_samples: - ## first render the basic info grid - ${render_basic_info_grid()} - %if not request.new() and edit_mode == 'False' and len(sample_ops.options) > 1: -
- For selected sample(s): - ${sample_ops.get_html()} +

Show Request Information

+
+ + + + + + + +
+
+ + %if request.desc: + ${request.desc} + %else: + None + %endif
- %if 'none' not in sample_ops.get_selected( return_label=True, return_value=True ) and len(selected_samples): -
- %if trans.app.model.Sample.bulk_operations.CHANGE_STATE in sample_ops.get_selected( return_label=True, return_value=True ): - <% - widgets, title = request.type.change_state_widgets(trans) - %> - %for w in widgets: -
- - ${w[1].get_html()} - %if w[0] == 'Comments': -
- Optional -
- %endif -
- %endfor -
- - -
- %elif trans.app.model.Sample.bulk_operations.SELECT_LIBRARY in sample_ops.get_selected( return_label=True, return_value=True ): -
- - ${bulk_lib_ops[0].get_html()} -
- %if not 'none' in bulk_lib_ops[0].get_selected( return_label=True, return_value=True ): -
- - ${bulk_lib_ops[1].get_html()} -
-
- - +
+ %for index, rd in enumerate(request_details): +
+ + %if not rd['value']: + None + %else: + %if rd['label'] == 'State': + ${rd['value']} + %else: + ${rd['value']} + %endif + %endif +
+
+ %endfor +
+
+ + ${request.create_time} +
+
+ + ${request.update_time} +
+
+ + <% emails = ', '.join(request.notification['email']) %> + %if emails: + ${emails} + %else: + None + %endif +
+
+
+ + <% + states = [] + for ss in request.type.states: + if ss.id in request.notification['sample_states']: + states.append(ss.name) + states = ', '.join(states) + %> + %if states: + ${states} + %else: + None + %endif +
+
+
+ +
+
+ + + %if current_samples: + ## first render the basic info grid + ${render_basic_info_grid()} + %if not request.new() and edit_mode == 'False' and len(sample_ops.options) > 1: +
+ For selected sample(s): + ${sample_ops.get_html()} +
+ %if 'none' not in sample_ops.get_selected( return_label=True, return_value=True ) and len(selected_samples): +
+ %if trans.app.model.Sample.bulk_operations.CHANGE_STATE in sample_ops.get_selected( return_label=True, return_value=True ): + <% + widgets, title = request.type.change_state_widgets(trans) + %> + %for w in widgets: +
+ + ${w[1].get_html()} + %if w[0] == 'Comments': +
+ Optional
- %endif - %endif + %endif +
+ %endfor +
+ + +
+ %elif trans.app.model.Sample.bulk_operations.SELECT_LIBRARY in sample_ops.get_selected( return_label=True, return_value=True ): +
+ + ${bulk_lib_ops[0].get_html()}
+ %if not 'none' in bulk_lib_ops[0].get_selected( return_label=True, return_value=True ): +
+ + ${bulk_lib_ops[1].get_html()} +
+
+ + +
+ %endif %endif - %endif - ## then render the other grid(s) - <% trans.sa_session.refresh( request.type.sample_form ) %> - %for grid_index, grid_name in enumerate(request.type.sample_form.layout): - ${render_grid( grid_index, grid_name, request.type.sample_form.fields_of_grid( grid_index ) )} - %endfor - %else: - +
%endif - ##
- %if request.samples and request.submitted(): - %endif - - %if edit_mode == 'False': - - - -
- - %if request.unsubmitted(): -
- %endif + ## then render the other grid(s) + <% trans.sa_session.refresh( request.type.sample_form ) %> + %for grid_index, grid_name in enumerate(request.type.sample_form.layout): + ${render_grid( grid_index, grid_name, request.type.sample_form.fields_of_grid( grid_index ) )} + %endfor + %else: + + %endif + %if request.samples and request.submitted(): + + %endif + %if edit_mode == 'False': +
- %if current_samples: - - - - ${sample_copy.get_html()} - %endif - -
+ + +
+ %if request.unsubmitted():
- - - -
- %if len(current_samples) and len(current_samples) <= len(request.samples): - + %if current_samples: + + + + ${sample_copy.get_html()} %endif +
- %endif - %if request.samples or current_samples: + %endif + + %if len(current_samples) and len(current_samples) <= len(request.samples): + + %endif + +
+ + + + %endif + %if request.samples or current_samples: +
+
+ +
+
+
+ %if edit_mode == 'True': +
+ + +
+ %elif edit_mode == 'True' or len(current_samples) > len(request.samples):
-
- -
-
-
- %if edit_mode == 'True': -
- - -
- %elif edit_mode == 'True' or len(current_samples) > len(request.samples): -
- - -
- %endif - + + +
%endif - - -## - + %endif +
- %if request.unsubmitted():

Show Import samples

@@ -438,11 +409,8 @@ $(document).ready(function(){
-## %endif - - <%def name="render_grid( grid_index, grid_name, fields_dict )">
<% if not grid_name: @@ -515,10 +483,8 @@ $(document).ready(function(){ - <% - trans.sa_session.refresh( request ) - %> - %for sample_index, info in enumerate(current_samples): + <% trans.sa_session.refresh( request ) %> + %for sample_index, info in enumerate( current_samples ): <% if sample_index in range(len(request.samples)): sample = request.samples[sample_index] @@ -563,8 +529,6 @@ $(document).ready(function(){ ${render_sample_datasets( cntrller, sample )} %endif - - %else: ${show_basic_info_form( sample_index, sample, info )} %endif @@ -589,7 +553,7 @@ $(document).ready(function(){ <%def name="show_basic_info_form( sample_index, sample, info )"> - +
${' (required)' }
@@ -599,7 +563,7 @@ $(document).ready(function(){ %if sample.request.unsubmitted(): %else: - + %endif %else: @@ -609,7 +573,7 @@ $(document).ready(function(){ %if sample.request.unsubmitted(): %else: - + %endif %else: @@ -701,13 +665,3 @@ $(document).ready(function(){ %endfor - - - - - - - - - - diff --git a/test/base/test_db_util.py b/test/base/test_db_util.py index 688ab7b8281..24312b31259 100644 --- a/test/base/test_db_util.py +++ b/test/base/test_db_util.py @@ -90,8 +90,10 @@ def get_latest_history_for_user( user ): galaxy.model.History.table.c.user_id==user.id ) ) \ .order_by( desc( galaxy.model.History.table.c.create_time ) ) \ .first() -def get_latest_ldda(): +def get_latest_ldda_by_name( name ): return sa_session.query( galaxy.model.LibraryDatasetDatasetAssociation ) \ + .filter( and_( galaxy.model.LibraryDatasetDatasetAssociation.table.c.name==name, + galaxy.model.LibraryDatasetDatasetAssociation.table.c.deleted == False ) ) \ .order_by( desc( galaxy.model.LibraryDatasetDatasetAssociation.table.c.create_time ) ) \ .first() def get_latest_lddas( limit ): diff --git a/test/base/twilltestcase.py b/test/base/twilltestcase.py index 2928c005387..b64c262d41e 100644 --- a/test/base/twilltestcase.py +++ b/test/base/twilltestcase.py @@ -767,68 +767,45 @@ class TwillTestCase( unittest.TestCase ): except: pass return previously_created, username_taken, invalid_username - def create_user_with_info( self, email, password, username, user_info_forms, user_info_form_id, user_info_values ): + def create_user_with_info( self, email, password, username, user_info_values, user_info_select='', admin_view='False', + strings_displayed=[], strings_displayed_after_submit=[] ): # This method creates a new user with associated info - if user_info_forms == 'multiple': - self.visit_url( "%s/user/create?user_info_select=%i&admin_view=False&use_panels=False" % ( self.url, user_info_form_id ) ) - else: - self.visit_url( "%s/user/create?admin_view=False&use_panels=False" % self.url ) - self.check_page_for_string( "Create account" ) + self.visit_url( "%s/user/create?admin_view=%s&use_panels=False" % ( self.url, admin_view ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str) tc.fv( "1", "email", email ) tc.fv( "1", "password", password ) tc.fv( "1", "confirm", password ) tc.fv( "1", "username", username ) - if user_info_forms == 'multiple': - self.check_page_for_string( "User type" ) - for index, info_value in enumerate(user_info_values): + if user_info_select: + # The user_info_select SelectField requires a refresh_on_change + self.refresh_form( 'user_info_select', user_info_select ) + for index, info_value in enumerate( user_info_values ): tc.fv( "1", "field_%i" % index, info_value ) tc.submit( "create_user_button" ) - def create_user_with_info_as_admin( self, email, password, username, user_info_forms, user_info_form_id, user_info_values ): - # This method creates a new user with associated info from the admin view - self.home() - if user_info_forms == 'multiple': - self.visit_page( "admin/users?operation=create?user_info_select=%i&admin_view=False" % user_info_form_id ) - else: - self.visit_page( "admin/users?operation=create" ) - self.check_page_for_string( "Create account" ) - tc.fv( "2", "email", email ) - tc.fv( "2", "password", password ) - tc.fv( "2", "confirm", password ) - tc.fv( "2", "username", username ) - if user_info_forms == 'multiple': - self.check_page_for_string( "User type" ) - for index, info_value in enumerate(user_info_values): - tc.fv( "2", "field_%i" % index, info_value ) - tc.submit( "create_user_button" ) - self.check_page_for_string( "Created new user account (%s)" % email ) - def edit_login_info( self, new_email, new_username, strings_displayed=[] ): - self.home() + def edit_user_info( self, new_email='', new_username='', password='', new_password='', + info_values=[], strings_displayed=[], strings_displayed_after_submit=[] ): self.visit_url( "%s/user/show_info" % self.url ) - self.check_page_for_string( "Manage User Information" ) - tc.fv( "login_info", "email", new_email ) - tc.fv( "login_info", "username", new_username ) - tc.submit( "login_info_button" ) for check_str in strings_displayed: self.check_page_for_string( check_str ) - def change_password( self, password, new_password ): + if new_email or new_username: + if new_email: + tc.fv( "login_info", "email", new_email ) + if new_username: + tc.fv( "login_info", "username", new_username ) + tc.submit( "login_info_button" ) + if password and new_password: + tc.fv( "change_password", "current", password ) + tc.fv( "change_password", "password", new_password ) + tc.fv( "change_password", "confirm", new_password ) + tc.submit( "change_password_button" ) + if info_values: + for index, info_value in enumerate( info_values ): + tc.fv( "user_info", "field_%i" % index, info_value ) + tc.submit( "edit_user_info_button" ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) self.home() - self.visit_page( "user/show_info" ) - self.check_page_for_string( "Manage User Information" ) - tc.fv( "change_password", "current", password ) - tc.fv( "change_password", "password", new_password ) - tc.fv( "change_password", "confirm", new_password ) - tc.submit( "change_password_button" ) - self.check_page_for_string( 'The password has been changed.' ) - def edit_user_info( self, info_values ): - self.home() - self.visit_page( "user/show_info" ) - self.check_page_for_string( "Manage User Information" ) - for index, info_value in enumerate(info_values): - tc.fv( "user_info", "field_%i" % index, info_value ) - tc.submit( "edit_user_info_button" ) - self.check_page_for_string( "The user information has been updated with the changes." ) - for value in info_values: - self.check_page_for_string( value ) def user_set_default_permissions( self, permissions_out=[], permissions_in=[], role_id='2' ): # role.id = 2 is Private Role for test2@bx.psu.edu # NOTE: Twill has a bug that requires the ~/user/permissions page to contain at least 1 option value @@ -1340,133 +1317,88 @@ class TwillTestCase( unittest.TestCase ): self.home() # Form stuff - def create_form( self, name, desc, formtype, form_layout_name='', num_fields=1 ): - """ - Create a new form definition. Testing framework is still limited to only testing - one instance for each repeat. This has to do with the 'flat' nature of defining - test param values. Using same-named parameters down different branches (having - different scope in the tool) cannot be properly tested when they both exist at the - same time. - """ - self.home() + def create_form( self, name, desc, form_type, field_type='TextField', form_layout_name='', + num_fields=1, num_options=0, strings_displayed=[], strings_displayed_after_submit=[] ): + """Create a new form definition.""" self.visit_url( "%s/forms/new" % self.url ) - self.check_page_for_string( 'Create a new form definition' ) - tc.fv( "1", "name", name ) # form field 1 is the field named name... - tc.fv( "1", "description", desc ) # form field 1 is the field named desc... - tc.fv( "1", "form_type_selectbox", formtype ) - tc.submit( "create_form_button" ) - if formtype == "Sequencing Sample Form": - tc.submit( "add_layout_grid" ) - tc.fv( "1", "grid_layout0", form_layout_name ) - for index in range( num_fields ): - field_name = 'field_name_%i' % index - field_contents = 'Field %i' % index - field_help_name = 'field_helptext_%i' % index - field_help_contents = 'Field %i help' % index - tc.fv( "1", field_name, field_contents ) - tc.fv( "1", field_help_name, field_help_contents ) - tc.submit( "save_changes_button" ) - if num_fields: - check_str = "The form '%s' has been updated with the changes." % name + for check_str in strings_displayed: self.check_page_for_string( check_str ) - else: - self.home() - self.visit_url( "%s/forms/manage" % self.url ) - self.check_page_for_string( name ) - self.check_page_for_string( desc ) - self.check_page_for_string( formtype ) - self.home() - # Form stuff - def create_single_field_type_form_definition( self, name, desc, formtype, field_type ): - """ - Create a new form definition containing 1 field of a specified type ( AddressField, CheckboxField, SelectField, - TextArea, TextField, WorkflowField ). The form_type param value should not be 'Sequencing Sample Form,' use - create_form() above for that. - """ - self.home() - # Create a new form definition - self.visit_url( "%s/forms/new" % self.url ) - self.check_page_for_string( 'Create a new form definition' ) tc.fv( "1", "name", name ) tc.fv( "1", "description", desc ) - tc.fv( "1", "form_type_selectbox", formtype ) + tc.fv( "1", "form_type_selectbox", form_type ) tc.submit( "create_form_button" ) - # Add 1 AddressField to the new form definition - field_name = 'field_name_0' - field_contents = field_type - field_help_name = 'field_helptext_0' - field_help_contents = '%s help' % field_type - field_default = 'field_default_0' - field_default_contents = '%s default contents' % field_type - tc.fv( "1", field_name, field_contents ) - tc.fv( "1", field_help_name, field_help_contents ) - self.refresh_form( 'field_type_0', field_type ) - if field_type == 'SelectField': - # Add 2 options so our select list is functional - tc.submit( "addoption_0" ) - tc.fv( "1", "field_0_option_0", "One" ) - tc.submit( "addoption_0" ) - tc.fv( "1", "field_0_option_1", "Two" ) - tc.fv( "1", field_default, field_default_contents ) + if form_type == "Sequencing Sample Form": + tc.submit( "add_layout_grid" ) + tc.fv( "1", "grid_layout0", form_layout_name ) + # Add fields to the new form definition + for index1 in range( num_fields ): + field_name = 'field_name_%i' % index1 + field_contents = field_type + field_help_name = 'field_helptext_%i' % index1 + field_help_contents = 'Field %i help' % index1 + field_default = 'field_default_0' + field_default_contents = '%s default contents' % form_type + tc.fv( "1", field_name, field_contents ) + tc.fv( "1", field_help_name, field_help_contents ) + if field_type == 'SelectField': + # SelectField field_type requires a refresh_on_change + self.refresh_form( 'field_type_0', field_type ) + # Add options so our select list is functional + if num_options == 0: + # Default to 2 options + num_options = 2 + for index2 in range( 1, num_options+1 ): + tc.submit( "addoption_0" ) + # Add contents to the new options fields + for index2 in range( num_options ): + option_field_name = 'field_0_option_%i' % index2 + option_field_value = 'Option%i' % index2 + tc.fv( "1", option_field_name, option_field_value ) + else: + tc.fv( "1", "field_type_0", field_type ) + tc.fv( "1", field_default, field_default_contents ) tc.submit( "save_changes_button" ) + if num_fields == 0: + self.visit_url( "%s/forms/manage" % self.url ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) self.home() - self.visit_url( "%s/forms/manage" % self.url ) - self.check_page_for_string( name ) - self.check_page_for_string( desc ) - self.check_page_for_string( formtype ) + def edit_form( self, id, form_type='', new_form_name='', new_form_desc='', field_dicts=[], field_index=0, + strings_displayed=[], strings_not_displayed=[], strings_displayed_after_submit=[] ): + """Edit form details; name and description""" self.home() - def edit_form( self, form_current_id, form_name, new_form_name="Form One's Name (Renamed)", new_form_desc="This is Form One's description (Re-described)"): - """ - Edit form details; name & description - """ - self.home() - self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) ) - self.check_page_for_string( 'Edit form definition "%s"' % form_name ) - tc.fv( "1", "name", new_form_name ) - tc.fv( "1", "description", new_form_desc ) - tc.submit( "save_changes_button" ) - self.check_page_for_string( "The form '%s' has been updated with the changes." % new_form_name ) - self.home() - def form_add_field( self, form_current_id, form_name, form_desc, form_type, form_layout_name='', field_index=0, fields=None): - """ - Add a new fields to the form definition - """ - self.home() - self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) ) - self.check_page_for_string( 'Edit form definition "%s"' % form_name) - for i, field in enumerate(fields): - index = i+field_index + self.visit_url( "%s/forms/manage?operation=Edit&id=%s" % ( self.url, id ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) + if new_form_name: + tc.fv( "1", "name", new_form_name ) + if new_form_desc: + tc.fv( "1", "description", new_form_desc ) + for i, field_dict in enumerate( field_dicts ): + index = i + field_index tc.submit( "add_field_button" ) - tc.fv( "1", "field_name_%i" % index, field['name'] ) - tc.fv( "1", "field_helptext_%i" % index, field['desc'] ) - tc.fv( "1", "field_type_%i" % index, field['type'] ) - tc.fv( "1", "field_required_%i" % index, field['required'] ) - if field['type'] == 'SelectField': - options = '' - for option_index, option in enumerate(field['selectlist']): - url_str = "%s/forms/manage?operation=Edit&description=%s&grid_layout0=%s&id=%s&form_type_selectbox=%s&addoption_%i=Add&name=%s&field_name_%i=%s&field_helptext_%i=%s&field_type_%i=%s" % \ - (self.url, form_desc.replace(" ", "+"), form_layout_name.replace(" ", "+"), - self.security.encode_id(form_current_id), form_type.replace(" ", "+"), - index, form_name.replace(" ", "+"), index, field['name'].replace(" ", "+"), - index, field['desc'].replace(" ", "+"), index, field['type']) - self.visit_url( url_str + options ) - tc.fv( "1", "field_%i_option_%i" % (index, option_index), option ) - options = options + "&field_%i_option_%i=%s" % (index, option_index, option) + field_name = "field_name_%i" % index + field_value = field_dict[ 'name' ] + field_help = "field_helptext_%i" % index + field_help_value = field_dict[ 'desc' ] + field_type = "field_type_%i" % index + field_type_value = field_dict[ 'type' ] + field_required = "field_required_%i" % index + field_required_value = field_dict[ 'required' ] + tc.fv( "1", field_name, field_value ) + tc.fv( "1", field_help, field_help_value ) + tc.fv( "1", field_required, field_required_value ) + if field_type_value.lower() == 'selectfield': + # SelectFields require a refresh_on_change + self.refresh_form( field_type, field_type_value ) + for option_index, option in enumerate( field_dict[ 'selectlist' ] ): + tc.submit( "addoption_0" ) + tc.fv( "1", "field_%i_option_%i" % ( index, option_index ), option ) + else: + tc.fv( "1", field_type, field_type_value ) tc.submit( "save_changes_button" ) - check_str = "The form '%s' has been updated with the changes." % form_name - self.check_page_for_string( check_str ) - self.home() - def form_remove_field( self, form_id, form_name, field_name): - """ - Remove a field from the form definition - """ - self.home() - self.visit_url( "%s/forms/manage?operation=Edit&form_id=%i&show_form=True" % (self.url, form_id) ) - self.check_page_for_string( 'Edit form definition "%s"' % form_name) - tc.submit( "remove_button" ) - tc.submit( "save_changes_button" ) - check_str = "The form '%s' has been updated with the changes." % form_name - self.check_page_for_string( check_str ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) self.home() def mark_form_deleted( self, form_id ): """Mark a form_definition as deleted""" @@ -1478,20 +1410,16 @@ class TwillTestCase( unittest.TestCase ): self.home() # Requests stuff - def check_request_grid(self, state, request_name, deleted=False): - self.home() - self.visit_url('%s/requests/list?sort=create_time&f-state=%s&f-deleted=%s' \ - % (self.url, state.replace(' ', '+'), str(deleted))) - self.check_page_for_string( request_name ) - def check_request_admin_grid(self, state, request_name, deleted=False): - self.home() - self.visit_url('%s/requests_admin/list?sort=create_time&f-state=%s&f-deleted=%s' \ - % (self.url, state.replace(' ', '+'), str(deleted))) - self.check_page_for_string( request_name ) - def create_request_type( self, name, desc, request_form_id, sample_form_id, states ): + def check_request_grid( self, cntrller, state, deleted=False, strings_displayed=[] ): + self.visit_url( '%s/%s/list?sort=create_time&f-state=%s&f-deleted=%s' % \ + ( self.url, cntrller, state.replace( ' ', '+' ), str( deleted ) ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) + def create_request_type( self, name, desc, request_form_id, sample_form_id, states, strings_displayed=[], strings_displayed_after_submit=[] ): self.home() self.visit_url( "%s/requests_admin/create_request_type" % self.url ) - self.check_page_for_string( 'Create a new sequencer configuration' ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) tc.fv( "1", "name", name ) tc.fv( "1", "desc", desc ) tc.fv( "1", "request_form_id", request_form_id ) @@ -1501,7 +1429,8 @@ class TwillTestCase( unittest.TestCase ): tc.fv("1", "state_name_%i" % index, state[0]) tc.fv("1", "state_desc_%i" % index, state[1]) tc.submit( "save_request_type" ) - self.check_page_for_string( "Sequencer configuration %s has been created" % name ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) def request_type_permissions( self, request_type_id, request_type_name, role_ids_str, permissions_in, permissions_out ): # role_ids_str must be a comma-separated string of role ids url = "requests_admin/manage_request_types?operation=permissions&id=%s&update_roles_button=Save" % ( request_type_id ) @@ -1516,87 +1445,123 @@ class TwillTestCase( unittest.TestCase ): check_str = "Permissions updated for sequencer configuration '%s'" % request_type_name self.check_page_for_string( check_str ) self.home() - def create_request( self, request_type_id, name, desc, fields ): - self.home() - self.visit_url( "%s/requests_common/new?select_request_type=%i&refresh=true&cntrller=requests" % ( self.url, - request_type_id ) ) - self.check_page_for_string( 'Add a new request' ) + def create_request( self, cntrller, request_type_id, name, desc, field_value_tuples, select_user_id='', + refresh='False', strings_displayed=[], strings_displayed_after_submit=[] ): + self.visit_url( "%s/requests_common/new?cntrller=%s&refresh=%s&select_request_type=True" % ( self.url, cntrller, refresh ) ) + # The select_request_type SelectList requires a refresh_on_change + self.refresh_form( 'select_request_type', request_type_id ) + if cntrller == 'requests_admin' and select_user_id: + # The admin is creating a request on behalf of another user + # The select_user SelectList requires a refresh_on_change + # gvk - 9/22/10: TODO: why does select_user require a refresh_on_change? Nothing in the + # code is apparent as to why this is done. + self.refresh_form( 'select_user', select_user_id ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) tc.fv( "1", "name", name ) tc.fv( "1", "desc", desc ) - for index, field_value in enumerate(fields): - tc.fv( "1", "field_%i" % index, field_value ) + for index, field_value_tuple in enumerate( field_value_tuples ): + field_name = "field_%i" % index + field_value, refresh_on_change = field_value_tuple + if refresh_on_change: + # TODO: If the field is an AddressField, we should test for adding a new address + # which would need to be handled here. This currently only allows an existing + # user_address to be selected. + self.refresh_form( field_name, field_value ) + else: + data = self.last_page() + file( 'greg.html', 'wb' ).write(data ) + tc.fv( "1", field_name, field_value ) tc.submit( "create_request_button" ) - self.check_page_for_string( name ) - self.check_page_for_string( desc ) - def edit_request( self, request_id, name, new_name, new_desc, new_fields): + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) self.home() - self.visit_url( "%s/requests/list?operation=Edit&id=%s" % (self.url, self.security.encode_id(request_id) ) ) + def edit_request( self, request_id, name, new_name='', new_desc='', new_fields=[], strings_displayed=[], strings_displayed_after_submit=[] ): + self.visit_url( "%s/requests/list?operation=Edit&id=%s" % ( self.url, request_id ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) self.check_page_for_string( 'Edit sequencing request "%s"' % name ) - tc.fv( "1", "name", new_name ) - tc.fv( "1", "desc", new_desc ) - for index, field_value in enumerate(new_fields): + if new_name: + tc.fv( "1", "name", new_name ) + if new_desc: + tc.fv( "1", "desc", new_desc ) + for index, field_value in enumerate( new_fields ): tc.fv( "1", "field_%i" % index, field_value ) tc.submit( "save_changes_request_button" ) - self.check_page_for_string( new_name ) - self.check_page_for_string( new_desc ) - def add_samples( self, request_id, request_name, samples ): - self.home() - url = "%s/requests/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) + def add_samples( self, cntrller, request_id, request_name, sample_value_tuples, strings_displayed=[], strings_displayed_after_submit=[] ): + self.visit_url( "%s/requests/list?operation=show&id=%s" % ( self.url, request_id ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) + # Simulate clicking the add-sample_button on the form. (gvk: 9/21/10 - TODO : There must be a bug in the mako template + # because twill cannot find any forms on the page, but I cannot find it although I've spent time cleaning up the + # template code and looking for any problems. + url = "%s/requests_common/request_page?cntrller=%s&edit_mode=False&id=%s" % ( self.url, cntrller, request_id ) + # This should work, but although twill does not thorw any exceptions, the button click never occurs + # There are multiple forms on this page, and we'll only be using the form named show_request. + # for sample_index, sample_value_tuple in enumerate( sample_value_tuples ): + # # Add the following form value to the already populated hidden field so that the show_request + # # form is the current form + # tc.fv( "1", "id", request_id ) + # tc.submit( 'add_sample_button' ) + for sample_index, sample_value_tuple in enumerate( sample_value_tuples ): + sample_name, field_values = sample_value_tuple + sample_name = sample_name.replace( ' ', '+' ) + field_name = "sample_%i_name" % sample_index + # The following form_value setting should work but since twill barfed on submitting the add_sample_button + # above, we have to simulate it by appending to the url. + # tc.fv( "1", field_name, sample_name ) + url += "&%s=%s" % ( field_name, sample_name ) + for field_index, field_value in enumerate( field_values ): + field_name = "sample_%i_field_%i" % ( sample_index, field_index ) + field_value = field_value.replace( ' ', '+' ) + # The following form_value setting should work but since twill barfed on submitting the add_sample_button + # above, we have to simulate it by appending to the url. + # tc.fv( "1", field_name, field_value ) + url += "&%s=%s" % ( field_name , field_value ) + # The following button submit should work but since twill barfed on submitting the add_sample_button + # above, we have to simulate it by appending to the url. + # tc.submit( "save_samples_button" ) + url += "&save_samples_button=Save" self.visit_url( url ) - self.check_page_for_string( 'Sequencing Request "%s"' % request_name ) - self.check_page_for_string( 'There are no samples.' ) - # this redundant stmt below is add so that the second form in - # the page gets selected - url = ["%s/requests_common/request_page?cntrller=requests&edit_mode=False&id=%s" % ( self.url, self.security.encode_id( request_id ) )] - for sample_index, sample in enumerate(samples): - sample_name, fields = sample - url.append("sample_%i_name=%s" % (sample_index, sample_name.replace(' ', '+'))) - for field_index, field_value in enumerate(fields): - url.append("sample_%i_field_%i=%s" % ( sample_index, field_index , field_value.replace(' ', '+') )) - url.append("save_samples_button=Save") - self.visit_url('&'.join(url)) - for sample_name, fields in samples: - self.check_page_for_string( sample_name ) - self.check_page_for_string( 'Unsubmitted' ) - for field_value in fields: - self.check_page_for_string( field_value ) - def submit_request( self, request_id, request_name ): - self.home() - self.visit_url( "%s/requests/list?operation=Submit&id=%s" % ( self.url, self.security.encode_id( request_id ) )) - self.check_page_for_string( 'The request %s has been submitted.' % request_name ) - def submit_request_as_admin( self, request_id, request_name ): - self.home() - self.visit_url( "%s/requests_admin/list?operation=Submit&id=%s" % ( self.url, self.security.encode_id( request_id ) )) - self.check_page_for_string( 'The request %s has been submitted.' % request_name ) - def reject_request( self, request_id, request_name, comment ): - self.home() - self.visit_url( "%s/requests_admin/list?operation=Reject&id=%s" % ( self.url, self.security.encode_id( request_id ) )) - self.check_page_for_string( 'Reject Sequencing Request "%s"' % request_name ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) + def submit_request( self, cntrller, request_id, request_name, strings_displayed_after_submit=[] ): + self.visit_url( "%s/%s/list?operation=Submit&id=%s" % ( self.url, cntrller, request_id ) ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) + def reject_request( self, request_id, request_name, comment, strings_displayed=[], strings_displayed_after_submit=[] ): + self.visit_url( "%s/requests_admin/list?operation=Reject&id=%s" % ( self.url, request_id ) ) + for check_str in strings_displayed: + self.check_page_for_string( check_str ) tc.fv( "1", "comment", comment ) tc.submit( "reject_button" ) - self.check_page_for_string( 'Request %s has been rejected.' % request_name ) - self.visit_url( "%s/requests/list?&operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) )) - self.check_page_for_string( comment ) - def add_bar_codes( self, request_id, request_name, bar_codes, samples ): - self.home() - url = "%s/requests/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) + def add_bar_codes( self, request_id, request_name, bar_codes, samples, strings_displayed_after_submit=[] ): + # We have to simulate the form submission here since twill barfs on the page + # gvk - 9/22/10 - TODO: make sure the mako template produces valid html + url = "%s/requests_common/request_page?cntrller=requests_admin&edit_mode=True&id=%s" % ( self.url, request_id ) + for index, field_value in enumerate( bar_codes ): + sample_field_name = "sample_%i_name" % index + sample_field_value = samples[ index ].name.replace( ' ', '+' ) + field_name = "sample_%i_barcode" % index + url += "&%s=%s" % ( field_name, field_value ) + url += "&%s=%s" % ( sample_field_name, sample_field_value ) + url += "&save_samples_button=Save" self.visit_url( url ) - self.check_page_for_string( 'Sequencing Request "%s"' % request_name ) - url = ["%s/requests_common/request_page?save_samples_button=Save&cntrller=requests&edit_mode=True&id=%s" % ( self.url, self.security.encode_id( request_id ) )] - for index, bar_code in enumerate(bar_codes): - url.append("sample_%i_barcode=%s" % (index, bar_code )) - url.append("sample_%i_name=%s" % (index, samples[index].name.replace(' ', '+') )) - self.visit_url('&'.join(url)) - self.check_page_for_string( 'Changes made to the sample(s) are saved.' ) - for index, bar_code in enumerate(bar_codes): - self.check_page_for_string( bar_code ) - def change_sample_state( self, request_id, request_name, sample_name, sample_id, new_state_id, new_state_name, comment='' ): - self.home() - url = "%s/requests/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) ) - self.visit_url( url ) - self.check_page_for_string( 'Sequencing Request "%s"' % request_name ) - url = "%s/requests_common/request_page?cntrller=requests_admin&edit_mode=False&id=%s&comment=%s&change_state_button=Save&select_sample_operation=%s&refresh=true&select_sample_%i=true&select_sample_%i=true&select_state=%i" % \ - (self.url, self.security.encode_id( request_id ), comment, "Change%20state", sample_id, sample_id, new_state_id ) + for check_str in strings_displayed_after_submit: + self.check_page_for_string( check_str ) + def change_sample_state( self, request_id, request_name, sample_name, sample_id, new_state_id, new_state_name, comment='', + strings_displayed=[], strings_displayed_after_submit=[] ): + # We have to simulate the form submission here since twill barfs on the page + # gvk - 9/22/10 - TODO: make sure the mako template produces valid html + url = "%s/requests_common/request_page?cntrller=requests_admin&edit_mode=False&id=%s" % ( self.url, request_id ) + # select_sample_%i=true must be included twice to simulate a CheckboxField checked setting. + url += "&comment=%s&select_sample_%i=true&select_sample_%i=true&select_state=%i" % ( comment, sample_id, sample_id, new_state_id ) + url += "&select_sample_operation=Change%20state&refresh=true" + url += "&change_state_button=Save" self.visit_url( url ) self.check_page_for_string( 'Sequencing Request "%s"' % request_name ) self.visit_url( "%s/requests_common/sample_events?cntrller=requests_admin&sample_id=%i" % (self.url, sample_id) ) @@ -1610,14 +1575,6 @@ class TwillTestCase( unittest.TestCase ): tc.fv( "1", field_name, value ) tc.submit( "new_address_button" ) self.check_page_for_string( 'Address (%s) has been added' % address_dict[ 'short_desc' ] ) - def add_user_address_as_admin( self, user_id, address_dict ): - self.home() - self.visit_url( "%s/user/new_address?admin_view=True&user_id=%i" % ( self.url, user_id ) ) - self.check_page_for_string( 'Add new address' ) - for field_name, value in address_dict.items(): - tc.fv( "1", field_name, value ) - tc.submit( "new_address_button" ) - self.check_page_for_string( 'Address (%s) has been added' % address_dict[ 'short_desc' ] ) # Library stuff def add_library_template( self, cntrller, item_type, library_id, form_id, form_name, folder_id=None, ldda_id=None ): @@ -1685,6 +1642,8 @@ class TwillTestCase( unittest.TestCase ): pass def browse_library( self, cntrller, id, show_deleted=False, strings_displayed=[], strings_not_displayed=[] ): self.visit_url( '%s/library_common/browse_library?cntrller=%s&id=%s&show_deleted=%s' % ( self.url, cntrller, id, str( show_deleted ) ) ) + data=self.last_page() + file( 'greg.html', 'wb' ).write( data ) for check_str in strings_displayed: self.check_page_for_string( check_str ) for check_str in strings_not_displayed: @@ -1878,6 +1837,8 @@ class TwillTestCase( unittest.TestCase ): tc.submit( "runtool_btn" ) # Give the files some time to finish uploading self.library_wait( library_id ) + data = self.last_page() + file( 'greg1.html', 'wb' ).write( data ) self.home() def ldda_permissions( self, cntrller, library_id, folder_id, id, role_ids_str, permissions_in=[], permissions_out=[], strings_displayed=[], ldda_name='' ): @@ -2033,7 +1994,7 @@ class TwillTestCase( unittest.TestCase ): check_str = "Library '%s' and all of its contents have been purged" % library_name self.check_page_for_string( check_str ) self.home() - def library_wait( self, library_id, cntrller='library_admin', maxiter=60 ): + def library_wait( self, library_id, cntrller='library_admin', maxiter=90 ): """Waits for the tools to finish""" count = 0 sleep_amount = 1 diff --git a/test/functional/test_forms_and_requests.py b/test/functional/test_forms_and_requests.py index a22a51448aa..5ca3ed3ba70 100644 --- a/test/functional/test_forms_and_requests.py +++ b/test/functional/test_forms_and_requests.py @@ -7,13 +7,13 @@ sample_states = [ ( 'New', 'Sample entered into the system' ), ( 'Received', 'Sample tube received' ), ( 'Done', 'Sequence run complete' ) ] address_dict = dict( short_desc="Office", - name="James+Bond", + name="James Bond", institution="MI6" , - address="MI6+Headquarters", + address="MI6 Headquarters", city="London", state="London", postal_code="007", - country="United+Kingdom", + country="United Kingdom", phone="007-007-0007" ) class TestFormsAndRequests( TwillTestCase ): @@ -90,72 +90,81 @@ class TestFormsAndRequests( TwillTestCase ): global role_two role_two = get_role_by_name( name ) assert role_two is not None, 'Problem retrieving role named "Role Two" from the database' - def test_010_create_form( self ): - """Testing creating a new form and editing it""" - self.logout() - self.login( email=admin_user.email ) - # create a form - name = "Request Form" - desc = "This is Form One's description" - formtype = galaxy.model.FormDefinition.types.REQUEST - self.create_form( name=name, desc=desc, formtype=formtype, num_fields=0 ) + def test_010_create_request_form( self ): + """Testing creating a request form definition, editing the name and description and adding fields""" + # Logged in as admin_user + # Create a form definition + tmp_name = "Temp form" + tmp_desc = "Temp form description" + form_type = galaxy.model.FormDefinition.types.REQUEST + self.create_form( name=tmp_name, + desc=tmp_desc, + form_type=form_type, + num_fields=0, + strings_displayed=[ 'Create a new form definition' ], + strings_displayed_after_submit=[ tmp_name, tmp_desc, form_type ] ) + tmp_form = get_form( tmp_name ) + # Edit the name and description of the form definition, and add 3 fields. + new_name = "Request Form" + new_desc = "Request Form description" + global test_field_name1 + test_field_name1 = 'Test field name one' + global test_field_name2 + test_field_name2 = 'Test field name two' + global test_field_name3 + test_field_name3 = 'Test field name three' + field_dicts = [ dict( name=test_field_name1, + desc='Test field description one', + type='SelectField', + required='optional', + selectlist=[ 'option1', 'option2' ] ), + dict( name=test_field_name2, + desc='Test field description two', + type='AddressField', + required='optional' ), + dict( name=test_field_name3, + desc='Test field description three', + type='TextField', + required='required' ) ] + self.edit_form( id=self.security.encode_id( tmp_form.current.id ), + new_form_name=new_name, + new_form_desc=new_desc, + field_dicts=field_dicts, + field_index=len( tmp_form.fields ), + strings_displayed=[ 'Edit form definition "%s"' % tmp_name ], + strings_displayed_after_submit=[ "The form '%s' has been updated with the changes." % new_name ] ) # Get the form_definition object for later tests global form_one - form_one = get_form( name ) - assert form_one is not None, 'Problem retrieving form named "%s" from the database' % name - # edit form & add few more fields - new_name = "Request Form (Renamed)" - new_desc = "This is Form One's Re-described" - self.edit_form( form_one.current.id, form_one.name, new_form_name=new_name, new_form_desc=new_desc ) - self.home() - self.visit_page( 'forms/manage' ) - self.check_page_for_string( new_name ) - self.check_page_for_string( new_desc ) form_one = get_form( new_name ) - def test_015_add_form_fields( self ): - """Testing adding fields to a form definition""" - fields = [dict(name='Test field name one', - desc='Test field description one', - type='SelectField', - required='optional', - selectlist=['option1', 'option2']), - dict(name='Test field name two', - desc='Test field description two', - type='AddressField', - required='optional'), - dict(name='Test field name three', - desc='Test field description three', - type='TextField', - required='required')] - self.form_add_field( form_one.current.id, - form_one.name, - form_one.desc, - form_one.type, - field_index=len( form_one.fields ), - fields=fields ) - form_one_latest = get_form( form_one.name ) - assert len( form_one_latest.fields ) == len( form_one.fields ) + len( fields ) - def test_020_create_sample_form( self ): - """Testing creating another form (for samples)""" + assert form_one is not None, 'Problem retrieving form named "%s" from the database' % new_name + assert len( form_one.fields ) == len( tmp_form.fields ) + len( field_dicts ) + def test_015_create_sample_form( self ): + """Testing creating sample form definition""" name = "Sample Form" desc = "This is Form Two's description" - formtype = galaxy.model.FormDefinition.types.SAMPLE + form_type = galaxy.model.FormDefinition.types.SAMPLE form_layout_name = 'Layout Grid One' - self.create_form( name=name, desc=desc, formtype=formtype, form_layout_name=form_layout_name ) + self.create_form( name=name, + desc=desc, + form_type=form_type, + form_layout_name=form_layout_name, + strings_displayed=[ 'Create a new form definition' ], + strings_displayed_after_submit=[ "The form '%s' has been updated with the changes." % name ] ) global form_two form_two = get_form( name ) assert form_two is not None, "Error retrieving form %s from db" % name - self.home() - self.visit_page( 'forms/manage' ) - self.check_page_for_string( form_two.name ) - self.check_page_for_string( desc ) - self.check_page_for_string( formtype ) - def test_025_create_request_type( self ): - """Testing creating a new requestype""" + def test_020_create_request_type( self ): + """Testing creating a request_type""" request_form = get_form( form_one.name ) sample_form = get_form( form_two.name ) name = 'Test Requestype' - self.create_request_type( name, "test sequencer configuration", str( request_form.id ), str( sample_form.id ), sample_states ) + self.create_request_type( name, + "test sequencer configuration", + str( request_form.id ), + str( sample_form.id ), + sample_states, + strings_displayed=[ 'Create a new sequencer configuration' ], + strings_displayed_after_submit=[ "Sequencer configuration %s has been created" % name ] ) global request_type1 request_type1 = get_request_type_by_name( name ) assert request_type1 is not None, 'Problem retrieving sequencer configuration named "%s" from the database' % name @@ -180,166 +189,207 @@ class TestFormsAndRequests( TwillTestCase ): pass self.logout() self.login( email=admin_user.email ) - def test_030_create_address_and_library( self ): - """Testing address & library creation""" - # ( 9/17/10 placed by gvk ) Hey, RC, why is this test here? The library is never used later in this script. - # first create a library for the request so that it can be submitted later - name = "TestLib001" - description = "TestLib001 description" - synopsis = "TestLib001 synopsis" - self.create_library( name=name, description=description, synopsis=synopsis ) - # Get the library object for later tests - global library_one - library_one = get_library( name, description, synopsis ) - assert library_one is not None, 'Problem retrieving library named "%s" from the database' % name - # Make sure library_one is public - assert 'access library' not in [ a.action for a in library_one.actions ], 'Library %s is not public when first created' % library_one.name - # Set permissions on the library, sort for later testing. - permissions_in = [ k for k, v in galaxy.model.Library.permitted_actions.items() ] - permissions_out = [] - # Role one members are: admin_user, regular_user1, regular_user3. Each of these users will be permitted for - # LIBRARY_ACCESS, LIBRARY_ADD, LIBRARY_MODIFY, LIBRARY_MANAGE on this library and it's contents. - self.library_permissions( self.security.encode_id( library_one.id ), - library_one.name, - str( role_one.id ), - permissions_in, - permissions_out ) - # Make sure the library is accessible by admin_user - self.visit_url( '%s/library/browse_libraries' % self.url ) - self.check_page_for_string( library_one.name ) - # Make sure the library is not accessible by regular_user2 since regular_user2 does not have Role1. - self.logout() - self.login( email=regular_user2.email ) - self.visit_url( '%s/library/browse_libraries' % self.url ) - try: - self.check_page_for_string( library_one.name ) - raise AssertionError, 'Library %s is accessible by %s when it should be restricted' % ( library_one.name, regular_user2.email ) - except: - pass - self.logout() - self.login( email=admin_user.email ) - # create folder - root_folder = library_one.root_folder - name = "Root Folder's Folder One" - description = "This is the root folder's Folder One" - self.add_folder( 'library_admin', - self.security.encode_id( library_one.id ), - self.security.encode_id( root_folder.id ), - name=name, - description=description ) - global folder_one - folder_one = get_folder( root_folder.id, name, description ) - assert folder_one is not None, 'Problem retrieving library folder named "%s" from the database' % name - # create address + def test_025_create_request( self ): + """Testing creating a sequence run request""" + # logged in as admin_user + # Create a user_address self.logout() self.login( email=regular_user1.email ) self.add_user_address( regular_user1.id, address_dict ) global user_address1 - user_address1 = get_user_address( regular_user1, address_dict[ 'short_desc' ] ) - def test_035_create_request( self ): - """Testing creating, editing and submitting a request as a regular user""" - # login as a regular user - self.logout() - self.login( email=regular_user1.email ) - # set field values - fields = ['option1', str(user_address1.id), 'field three value'] - # create the request + user_address1 = get_user_address( regular_user1, address_dict[ 'short_desc' ] ) + # Set field values - the tuples in the field_values list include the field_value, and True if refresh_on_change + # is required for that field. + field_value_tuples = [ ( 'option1', False ), ( str( user_address1.id ), True ), ( 'field three value', False ) ] + # Create the request name = 'Request One' desc = 'Request One Description' - self.create_request(request_type1.id, name, desc, fields) + self.create_request( cntrller='requests', + request_type_id=str( request_type1.id ), + name=name, + desc=desc, + field_value_tuples=field_value_tuples, + strings_displayed=[ 'Add a new request', + test_field_name1, + test_field_name2, + test_field_name3 ], + strings_displayed_after_submit=[ name, desc ] ) global request_one request_one = get_request_by_name( name ) - # check if the request's state is now set to 'new' + # Make sure the request's state is now set to NEW assert request_one.state is not request_one.states.NEW, "The state of the request '%s' should be set to '%s'" \ % ( request_one.name, request_one.states.NEW ) - # sample fields - samples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ), - ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ] - # add samples to this request - self.add_samples( request_one.id, request_one.name, samples ) - # edit this request - fields = ['option2', str(user_address1.id), 'field three value (edited)'] - self.edit_request(request_one.id, request_one.name, request_one.name+' (Renamed)', - request_one.desc+' (Re-described)', fields) + # Sample fields - the tuple represents a sample name and a list of sample form field values + sample_value_tuples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ), + ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ] + strings_displayed_after_submit = [ 'Unsubmitted' ] + for sample_name, field_values in sample_value_tuples: + strings_displayed_after_submit.append( sample_name ) + for field_value in field_values: + strings_displayed_after_submit.append( field_value ) + # Add samples to the request + self.add_samples( cntrller='requests', + request_id=self.security.encode_id( request_one.id ), + request_name=request_one.name, + sample_value_tuples=sample_value_tuples, + strings_displayed=[ 'Sequencing Request "%s"' % request_one.name, + 'There are no samples.' ], + strings_displayed_after_submit=strings_displayed_after_submit ) + def test_030_edit_request( self ): + """Testing editing a sequence run request""" + # logged in as regular_user1 + fields = [ 'option2', str( user_address1.id ), 'field three value (edited)' ] + new_name=request_one.name + ' (Renamed)' + new_desc=request_one.desc + ' (Re-described)' + self.edit_request( request_id=self.security.encode_id( request_one.id ), + name=request_one.name, + new_name=new_name, + new_desc=new_desc, + new_fields=fields, + strings_displayed=[ 'Edit sequencing request "%s"' % request_one.name ], + strings_displayed_after_submit=[ new_name, new_desc ] ) refresh( request_one ) # check if the request is showing in the 'new' filter - self.check_request_grid(state=request_one.states.NEW, request_name=request_one.name) - # submit the request - self.submit_request( request_one.id, request_one.name ) + self.check_request_grid( cntrller='requests', + state=request_one.states.NEW, + strings_displayed=[ request_one.name ] ) + def test_035_submit_request( self ): + """Testing editing a sequence run request""" + # logged in as regular_user1 + self.submit_request( cntrller='requests', + request_id=self.security.encode_id( request_one.id ), + request_name=request_one.name, + strings_displayed_after_submit=[ 'The request %s has been submitted.' % request_one.name ] ) refresh( request_one ) - # check if the request is showing in the 'submitted' filter - self.check_request_grid(state=request_one.states.SUBMITTED, request_name=request_one.name) - # check if the request's state is now set to 'submitted' + # Make sure the request is showing in the 'submitted' filter + self.check_request_grid( cntrller='requests', + state=request_one.states.SUBMITTED, + strings_displayed=[ request_one.name ] ) + # Make sure the request's state is now set to 'submitted' assert request_one.state is not request_one.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \ % ( request_one.name, request_one.states.SUBMITTED ) def test_040_request_lifecycle( self ): - """Testing request lifecycle as it goes through all the states""" - # goto admin manage requests page + """Testing request life-cycle as it goes through all the states""" + # logged in as regular_user1 self.logout() self.login( email=admin_user.email ) - self.check_request_admin_grid(state=request_one.states.SUBMITTED, request_name=request_one.name) - self.visit_url( "%s/requests_admin/list?operation=show&id=%s" \ - % ( self.url, self.security.encode_id( request_one.id ) )) + self.check_request_grid( cntrller='requests_admin', + state=request_one.states.SUBMITTED, + strings_displayed=[ request_one.name ] ) + self.visit_url( "%s/requests_admin/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_one.id ) )) self.check_page_for_string( 'Sequencing Request "%s"' % request_one.name ) - # set bar codes for the samples + # Set bar codes for the samples bar_codes = [ '1234567890', '0987654321' ] - self.add_bar_codes( request_one.id, request_one.name, bar_codes, request_one.samples ) - # change the states of all the samples of this request + strings_displayed_after_submit=[ 'Changes made to the sample(s) are saved.' ] + for bar_code in bar_codes: + strings_displayed_after_submit.append( bar_code ) + self.add_bar_codes( request_id=self.security.encode_id( request_one.id ), + request_name=request_one.name, + bar_codes=bar_codes, + samples=request_one.samples, + strings_displayed_after_submit=strings_displayed_after_submit ) + # Change the states of all the samples of this request to ultimately be COMPLETE for sample in request_one.samples: - self.change_sample_state( request_one.id, request_one.name, sample.name, sample.id, request_type1.states[1].id, request_type1.states[1].name ) - self.change_sample_state( request_one.id, request_one.name, sample.name, sample.id, request_type1.states[2].id, request_type1.states[2].name ) - self.home() + self.change_sample_state( request_id=self.security.encode_id( request_one.id ), + request_name=request_one.name, + sample_name=sample.name, + sample_id=sample.id, + new_state_id=request_type1.states[1].id, + new_state_name=request_type1.states[1].name ) + self.change_sample_state( request_id=self.security.encode_id( request_one.id ), + request_name=request_one.name, + sample_name=sample.name, + sample_id=sample.id, + new_state_id=request_type1.states[2].id, + new_state_name=request_type1.states[2].name ) refresh( request_one ) self.logout() self.login( email=regular_user1.email ) # check if the request's state is now set to 'complete' - self.check_request_grid(state='Complete', request_name=request_one.name) + self.check_request_grid( cntrller='requests', + state='Complete', + strings_displayed=[ request_one.name ] ) assert request_one.state is not request_one.states.COMPLETE, "The state of the request '%s' should be set to '%s'" \ % ( request_one.name, request_one.states.COMPLETE ) def test_045_admin_create_request_on_behalf_of_regular_user( self ): """Testing creating and submitting a request as an admin on behalf of a regular user""" + # Logged in as regular_user1 self.logout() self.login( email=admin_user.email ) + # Create the request name = "RequestTwo" - # TODO: fix this test so it is no longer simulated. - # simulate request creation - url_str = '%s/requests_common/new?cntrller=requests_admin&create_request_button=Save&select_request_type=%i&select_user=%i&name=%s&refresh=True&field_2=%s&field_0=%s&field_1=%i' \ - % ( self.url, request_type1.id, regular_user1.id, name, "field_2_value", 'option1', user_address1.id ) - self.home() - self.visit_url( url_str ) - self.check_page_for_string( "The new request named %s has been created" % name ) + desc = 'Request Two Description' + # Set field values - the tuples in the field_values list include the field_value, and True if refresh_on_change + # is required for that field. + field_value_tuples = [ ( 'option2', False ), ( str( user_address1.id ), True ), ( 'field_2_value', False ) ] + self.create_request( cntrller='requests_admin', + request_type_id=str( request_type1.id ), + select_user_id=str( regular_user1.id ), + name=name, + desc=desc, + refresh='True', + field_value_tuples=field_value_tuples, + strings_displayed=[ 'Add a new request', + test_field_name1, + test_field_name2, + test_field_name3 ], + strings_displayed_after_submit=[ "The new request named %s has been created" % name ] ) global request_two request_two = get_request_by_name( name ) - # check if the request is showing in the 'new' filter - self.check_request_admin_grid(state=request_two.states.NEW, request_name=request_two.name) - # check if the request's state is now set to 'new' + # Make sure the request is showing in the 'new' filter + self.check_request_grid( cntrller='requests_admin', + state=request_two.states.NEW, + strings_displayed=[ request_two.name ] ) + # Make sure the request's state is now set to 'new' assert request_two.state is not request_two.states.NEW, "The state of the request '%s' should be set to '%s'" \ % ( request_two.name, request_two.states.NEW ) - # sample fields - samples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ), - ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ] - # add samples to this request - self.add_samples( request_two.id, request_two.name, samples ) - # submit the request - self.submit_request_as_admin( request_two.id, request_two.name ) + # Sample fields - the tuple represents a sample name and a list of sample form field values + sample_value_tuples = [ ( 'Sample One', [ 'S1 Field 0 Value' ] ), + ( 'Sample Two', [ 'S2 Field 0 Value' ] ) ] + strings_displayed_after_submit = [ 'Unsubmitted' ] + for sample_name, field_values in sample_value_tuples: + strings_displayed_after_submit.append( sample_name ) + for field_value in field_values: + strings_displayed_after_submit.append( field_value ) + # Add samples to the request + self.add_samples( cntrller='requests_admin', + request_id=self.security.encode_id( request_two.id ), + request_name=request_two.name, + sample_value_tuples=sample_value_tuples, + strings_displayed=[ 'Sequencing Request "%s"' % request_two.name, + 'There are no samples.' ], + strings_displayed_after_submit=strings_displayed_after_submit ) + # Submit the request + self.submit_request( cntrller='requests_admin', + request_id=self.security.encode_id( request_two.id ), + request_name=request_two.name, + strings_displayed_after_submit=[ 'The request %s has been submitted.' % request_two.name ] ) refresh( request_two ) - # check if the request is showing in the 'submitted' filter - self.check_request_admin_grid(state=request_two.states.SUBMITTED, request_name=request_two.name) - # check if the request's state is now set to 'submitted' + # Make sure the request is showing in the 'submitted' filter + self.check_request_grid( cntrller='requests_admin', + state=request_two.states.SUBMITTED, + strings_displayed=[ request_two.name ] ) + # Make sure the request's state is now set to 'submitted' assert request_two.state is not request_two.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \ % ( request_two.name, request_two.states.SUBMITTED ) - # check if both the requests is showing in the 'All' filter - self.check_request_admin_grid(state='All', request_name=request_one.name) - self.check_request_admin_grid(state='All', request_name=request_two.name) + # Make sure both requests are showing in the 'All' filter + self.check_request_grid( cntrller='requests_admin', + state='All', + strings_displayed=[ request_one.name, request_two.name ] ) def test_050_reject_request( self ): - '''Testing rejecting a request''' - self.logout() - self.login( email=admin_user.email ) - self.reject_request( request_two.id, request_two.name, "Rejection test comment" ) + """Testing rejecting a request""" + # Logged in as admin_user + self.reject_request( request_id=self.security.encode_id( request_two.id ), + request_name=request_two.name, + comment="Rejection test comment", + strings_displayed=[ 'Reject Sequencing Request "%s"' % request_two.name ], + strings_displayed_after_submit=[ 'Request %s has been rejected.' % request_two.name ] ) refresh( request_two ) - # check if the request is showing in the 'rejected' filter - self.check_request_admin_grid(state=request_two.states.REJECTED, request_name=request_two.name) - # check if the request's state is now set to 'submitted' + # Make sure the request is showing in the 'rejected' filter + self.check_request_grid( cntrller='requests_admin', + state=request_two.states.REJECTED, + strings_displayed=[ request_two.name ] ) + # Make sure the request's state is now set to REJECTED assert request_two.state is not request_two.states.REJECTED, "The state of the request '%s' should be set to '%s'" \ % ( request_two.name, request_two.states.REJECTED ) def test_055_reset_data_for_later_test_runs( self ): @@ -371,16 +421,6 @@ class TestFormsAndRequests( TwillTestCase ): for user_address in [ user_address1 ]: mark_obj_deleted( user_address ) ################## - # Purge all libraries - ################## - for library in [ library_one ]: - self.delete_library_item( 'library_admin', - self.security.encode_id( library.id ), - self.security.encode_id( library.id ), - library.name, - item_type='library' ) - self.purge_library( self.security.encode_id( library.id ), library.name ) - ################## # Delete all non-private roles ################## for role in [ role_one, role_two ]: diff --git a/test/functional/test_library_features.py b/test/functional/test_library_features.py index 3539c9c9d6c..060a8f8489d 100644 --- a/test/functional/test_library_features.py +++ b/test/functional/test_library_features.py @@ -127,7 +127,7 @@ class TestLibraryFeatures( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda2 - ldda2 = get_latest_ldda() + ldda2 = get_latest_ldda_by_name( filename ) assert ldda2 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda2 from the database' self.browse_library( 'library_admin', self.security.encode_id( library1.id ), @@ -146,7 +146,7 @@ class TestLibraryFeatures( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda3 - ldda3 = get_latest_ldda() + ldda3 = get_latest_ldda_by_name( filename ) assert ldda3 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda3 from the database' self.browse_library( 'library_admin', self.security.encode_id( library1.id ), @@ -155,7 +155,8 @@ class TestLibraryFeatures( TwillTestCase ): """Testing copying a dataset from the current history to a subfolder""" # logged in as admin_user self.new_history() - self.upload_file( "4.bed" ) + filename = '4.bed' + self.upload_file( filename ) latest_hda = get_latest_hda() self.upload_library_dataset( cntrller='library_admin', library_id=self.security.encode_id( library1.id ), @@ -165,7 +166,7 @@ class TestLibraryFeatures( TwillTestCase ): ldda_message='Imported from history', strings_displayed=[ 'Active datasets in your current history' ] ) global ldda4 - ldda4 = get_latest_ldda() + ldda4 = get_latest_ldda_by_name( filename ) assert ldda4 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda4 from the database' self.browse_library( 'library_admin', self.security.encode_id( library1.id ), @@ -199,7 +200,7 @@ class TestLibraryFeatures( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files', 'You are currently selecting a new file to replace' ] ) global ldda4_version2 - ldda4_version2 = get_latest_ldda() + ldda4_version2 = get_latest_ldda_by_name( filename ) assert ldda4_version2 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda4_version2 from the database' self.ldda_edit_info( 'library_admin', self.security.encode_id( library1.id ), @@ -271,15 +272,16 @@ class TestLibraryFeatures( TwillTestCase ): # logged in as regular_user3 self.logout() self.login( email=admin_user.email ) + filename = '1.bed' self.upload_library_dataset( cntrller='library_admin', library_id=self.security.encode_id( library1.id ), folder_id=self.security.encode_id( library1.root_folder.id ), - filename='1.bed', + filename=filename, file_type='bed', dbkey='hg18', strings_displayed=[ 'Upload files' ] ) global ldda1 - ldda1 = get_latest_ldda() + ldda1 = get_latest_ldda_by_name( filename ) assert ldda1 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda1 from the database' for format in ( 'tbz', 'tgz', 'zip' ): archive = self.download_archive_of_library_files( cntrller='library', diff --git a/test/functional/test_library_security.py b/test/functional/test_library_security.py index 2656e8f35d7..a5f390d2dee 100644 --- a/test/functional/test_library_security.py +++ b/test/functional/test_library_security.py @@ -153,7 +153,7 @@ class TestLibrarySecurity( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda1 - ldda1 = get_latest_ldda() + ldda1 = get_latest_ldda_by_name( filename ) assert ldda1 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda1 from the database' self.browse_library( 'library_admin', self.security.encode_id( library1.id ), @@ -258,10 +258,10 @@ class TestLibrarySecurity( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda2 - ldda2 = get_latest_ldda() + ldda2 = get_latest_ldda_by_name( filename ) assert ldda2 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda2 from the database' - self.browse_library( 'library', - self.security.encode_id( library1.id ), + self.browse_library( cntrller='library', + id=self.security.encode_id( library1.id ), strings_displayed=[ ldda2.name, ldda2.message, admin_user.email ] ) def test_045_accessing_ldda2_with_role_associated_with_group_and_users( self ): """Testing accessing ldda2 with a role that is associated with a group and users""" @@ -272,7 +272,7 @@ class TestLibrarySecurity( TwillTestCase ): strings_displayed=[ ldda2.name, ldda2.message, admin_user.email ] ) self.logout() # regular_user1 should be able to see 2.bed since she is associated with group_two - self.login( email = 'test1@bx.psu.edu' ) + self.login( email = regular_user1.email ) self.browse_library( 'library', self.security.encode_id( library1.id ), strings_displayed=[ folder1.name, ldda2.name, ldda2.message, admin_user.email ] ) @@ -293,9 +293,9 @@ class TestLibrarySecurity( TwillTestCase ): self.security.encode_id( folder1.id ), self.security.encode_id( ldda2.id ), ldda2.name, - strings_displayed=['2.bed', - 'This is the latest version of this library dataset', - 'Edit attributes of 2.bed' ] ) + strings_displayed=[ '2.bed', + 'This is the latest version of this library dataset', + 'Edit attributes of 2.bed' ] ) self.act_on_multiple_datasets( 'library', self.security.encode_id( library1.id ), 'import_to_history', @@ -465,7 +465,7 @@ class TestLibrarySecurity( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda6 - ldda6 = get_latest_ldda() + ldda6 = get_latest_ldda_by_name( filename ) assert ldda6 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda6 from the database' def test_070_add_folder2_to_library2( self ): """Testing adding folder2 to a library2""" @@ -495,7 +495,7 @@ class TestLibrarySecurity( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda7 - ldda7 = get_latest_ldda() + ldda7 = get_latest_ldda_by_name( filename ) assert ldda7 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda7 from the database' def test_080_add_subfolder2_to_folder2( self ): """Testing adding subfolder2 to a folder2""" @@ -524,10 +524,10 @@ class TestLibrarySecurity( TwillTestCase ): ldda_message=ldda_message, strings_displayed=[ 'Upload files' ] ) global ldda8 - ldda8 = get_latest_ldda() + ldda8 = get_latest_ldda_by_name( filename ) assert ldda8 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda8 from the database' def test_090_make_library2_and_contents_public( self ): - """Testing making library2 and all of it's contetns public""" + """Testing making library2 and all of it's contents public""" self.make_library_item_public( self.security.encode_id( library2.id ), self.security.encode_id( library2.id ), item_type='library', diff --git a/test/functional/test_library_templates.py b/test/functional/test_library_templates.py index 6113590fe76..a5d5a5c4f55 100644 --- a/test/functional/test_library_templates.py +++ b/test/functional/test_library_templates.py @@ -37,11 +37,16 @@ class TestLibraryFeatures( TwillTestCase ): # Logged in as admin_user for type in [ 'AddressField', 'CheckboxField', 'SelectField', 'TextArea', 'TextField', 'WorkflowField' ]: form_desc = '%s description' % type + num_options = 0 + if type == 'SelectField': + # Pass number of options we want in our SelectField + num_options = 2 # Create form for library template - self.create_single_field_type_form_definition( name=type, - desc=form_desc, - formtype=galaxy.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE, - field_type=type ) + self.create_form( name=type, + desc=form_desc, + form_type=galaxy.model.FormDefinition.types.LIBRARY_INFO_TEMPLATE, + field_type=type, + num_options=num_options ) # Get all of the new form definitions for later use global AddressField_form AddressField_form = get_form( 'AddressField' ) @@ -147,7 +152,7 @@ class TestLibraryFeatures( TwillTestCase ): user_address1 = get_user_address( admin_user, short_desc ) assert user_address1 is not None, 'Problem retrieving user_address1 from the database' global ldda1 - ldda1 = get_latest_ldda() + ldda1 = get_latest_ldda_by_name( filename ) assert ldda1 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda1 from the database' self.browse_library( 'library_admin', self.security.encode_id( library1.id ), @@ -269,7 +274,7 @@ class TestLibraryFeatures( TwillTestCase ): dbkey='hg18', ldda_message=ldda_message, strings_displayed=[ 'CheckboxField', 'checked' ] ) - ldda = get_latest_ldda() + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library2.id ), @@ -290,9 +295,10 @@ class TestLibraryFeatures( TwillTestCase ): self.security.encode_id( SelectField_form.id ), SelectField_form.name ) # Select the 2nd option in the SelectField to make sure the template contents are inherited + # SelectField option names are zero-based self.library_info( 'library_admin', self.security.encode_id( library3.id ), - template_fields=[ ( 'field_0', 'Two' ) ] ) + template_fields=[ ( 'field_0', 'Option1' ) ] ) def test_085_add_folder3_to_library3( self ): """Testing adding a folder to library3""" # Logged in as admin_user @@ -320,10 +326,10 @@ class TestLibraryFeatures( TwillTestCase ): self.folder_info( cntrller='library_admin', folder_id=self.security.encode_id( folder3.id ), library_id=self.security.encode_id( library3.id ), - template_fields=[ ( "field_0", 'Two' ) ], + template_fields=[ ( "field_0", 'Option1' ) ], strings_displayed=[ SelectField_form.name, 'This is an inherited template and is not required to be used with this folder', - 'Two' ] ) + 'Option1' ] ) def test_100_add_ldda_to_folder3( self ): """ Testing adding a new library dataset to library3's folder, @@ -339,8 +345,8 @@ class TestLibraryFeatures( TwillTestCase ): file_type='bed', dbkey='hg18', ldda_message=ldda_message, - strings_displayed=[ 'SelectField', 'selected>Two' ] ) - ldda = get_latest_ldda() + strings_displayed=[ 'SelectField', 'selected>Option1' ] ) + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library3.id ), @@ -351,7 +357,7 @@ class TestLibraryFeatures( TwillTestCase ): self.security.encode_id( folder3.id ), self.security.encode_id( ldda.id ), ldda.name, - strings_displayed=[ 'SelectField', 'Two' ] ) + strings_displayed=[ 'SelectField', 'Option1' ] ) def test_105_add_template_to_library4( self ): """ Testing add an inheritable template containing an TextArea to library4""" # Logged in as admin_user @@ -406,7 +412,7 @@ class TestLibraryFeatures( TwillTestCase ): dbkey='hg18', ldda_message=ldda_message, strings_displayed=[ 'TextArea', 'This text should be inherited' ] ) - ldda = get_latest_ldda() + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library4.id ), @@ -471,7 +477,7 @@ class TestLibraryFeatures( TwillTestCase ): dbkey='hg18', ldda_message=ldda_message, strings_displayed=[ 'TextField', 'This text should be inherited' ] ) - ldda = get_latest_ldda() + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library5.id ), @@ -512,7 +518,7 @@ class TestLibraryFeatures( TwillTestCase ): strings_displayed=[ 'TextField', 'This text should be inherited', 'TextArea' ] ) - ldda = get_latest_ldda() + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library5.id ), @@ -576,7 +582,7 @@ class TestLibraryFeatures( TwillTestCase ): dbkey='hg18', ldda_message=ldda_message, strings_displayed=[ 'WorkflowField', 'none' ] ) - ldda = get_latest_ldda() + ldda = get_latest_ldda_by_name( filename ) assert ldda is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda from the database' self.browse_library( 'library_admin', self.security.encode_id( library6.id ), diff --git a/test/functional/test_user_info.py b/test/functional/test_user_info.py index 57f19416070..ba5cfdf9336 100644 --- a/test/functional/test_user_info.py +++ b/test/functional/test_user_info.py @@ -1,9 +1,6 @@ from base.twilltestcase import * from base.test_db_util import * -# TODO: ( gvk: 9/17/10 ) The code in this script was so horribly written that it could not be maintained. I will fix the worst code -# as soon as I get a chance. I've already gotten started, but have run out of time so I'm commenting out the broken tests for now... - class TestUserInfo( TwillTestCase ): def test_000_initiate_users( self ): """Ensuring all required user accounts exist""" @@ -35,154 +32,172 @@ class TestUserInfo( TwillTestCase ): assert admin_user is not None, 'Problem retrieving user with email "test@bx.psu.edu" from the database' global admin_user_private_role admin_user_private_role = get_private_role( admin_user ) - """ def test_005_create_user_info_forms( self ): - Testing creating a new user info form and editing it + """Testing creating a new user info form and editing it""" # Logged in as admin_user # Create a the first form name = "Student" desc = "This is Student user info form's description" - formtype = get_user_info_form_definition() - self.create_form( name=name, desc=desc, formtype=formtype, num_fields=0 ) + form_type = get_user_info_form_definition() + self.create_form( name=name, + desc=desc, + form_type=form_type, + num_fields=0, + strings_displayed=[ 'Create a new form definition' ], + strings_displayed_after_submit=[ name, desc, form_type ] ) + tmp_form = get_form( name ) + # Add fields to the form + field_dicts = [ dict( name='Affiliation', + desc='The type of organization you are affiliated with', + type='SelectField', + required='optional', + selectlist=[ 'Educational', 'Research', 'Commercial' ] ), + dict( name='Name of Organization', + desc='', + type='TextField', + required='optional' ), + dict( name='Contact for feedback', + desc='', + type='CheckboxField', + required='optional' ) ] + self.edit_form( id=self.security.encode_id( tmp_form.current.id ), + field_dicts=field_dicts, + field_index=len( tmp_form.fields ), + strings_displayed=[ 'Edit form definition "%s"' % name ], + strings_displayed_after_submit=[ "The form '%s' has been updated with the changes." % name ] ) # Get the form_definition object for later tests global form_one form_one = get_form( name ) assert form_one is not None, 'Problem retrieving form named "%s" from the database' % name - # edit form & add few more fields - fields = [dict(name='Affiliation', - desc='The type of organization you are affiliated with', - type='SelectField', - required='optional', - selectlist=['Educational', 'Research', 'Commercial']), - dict(name='Name of Organization', - desc='', - type='TextField', - required='optional'), - dict(name='Contact for feedback', - desc='', - type='CheckboxField', - required='optional')] - self.form_add_field( form_one.current.id, - form_one.name, - form_one.desc, - form_one.type, - field_index=len( form_one.fields ), - fields=fields) - form_one_latest = get_form( form_one.name ) - assert len( form_one_latest.fields ) == len( form_one.fields ) + len( fields ) - # create the second form + assert len( form_one.fields ) == len( tmp_form.fields ) + len( field_dicts ) + # Create the second form name = "Researcher" desc = "This is Researcher user info form's description" - self.create_form( name=name, desc=desc, formtype=formtype, num_fields=0 ) + self.create_form( name=name, + desc=desc, + form_type=form_type, + num_fields=0, + strings_displayed=[ 'Create a new form definition' ], + strings_displayed_after_submit=[ name, desc, form_type ] ) + tmp_form = get_form( name ) + # Add fields to the form + field_dicts = [ dict( name='Affiliation', + desc='The type of organization you are affiliated with', + type='SelectField', + required='optional', + selectlist=[ 'Educational', 'Research', 'Commercial' ] ), + dict( name='Name of Organization', + desc='', + type='TextField', + required='optional' ), + dict( name='Contact for feedback', + desc='', + type='CheckboxField', + required='optional' ) ] + self.edit_form( id=self.security.encode_id( tmp_form.current.id ), + field_dicts=field_dicts, + field_index=len( tmp_form.fields ), + strings_displayed=[ 'Edit form definition "%s"' % name ], + strings_displayed_after_submit=[ "The form '%s' has been updated with the changes." % name ] ) # Get the form_definition object for later tests global form_two form_two = get_form( name ) assert form_two is not None, 'Problem retrieving form named "%s" from the database' % name - # edit form & add few more fields - fields = [dict(name='Affiliation', - desc='The type of organization you are affiliated with', - type='SelectField', - required='optional', - selectlist=['Educational', 'Research', 'Commercial']), - dict(name='Name of Organization', - desc='', - type='TextField', - required='optional'), - dict(name='Contact for feedback', - desc='', - type='CheckboxField', - required='optional')] - self.form_add_field( form_two.current.id, - form_two.name, - form_two.desc, - form_two.type, - field_index=len( form_one.fields ), - fields=fields ) - form_two_latest = get_form( form_two.name ) - assert len( form_two_latest.fields ) == len( form_two.fields ) + len( fields ) + assert len( form_two.fields ) == len( tmp_form.fields ) + len( field_dicts ) def test_010_user_reqistration_multiple_user_info_forms( self ): - Testing user registration with multiple user info forms + """Testing user registration with multiple user info forms""" # Logged in as admin_user self.logout() - # Create a new user with 'Student' user info form - user_info_values=[ 'Educational', 'Penn State', True ] - self.create_user_with_info( 'test11@bx.psu.edu', - 'testuser', - 'test11', - user_info_forms='multiple', - user_info_form_id=form_one.id, - user_info_values=user_info_values ) + # Create a new user with 'Student' user info form. The user_info_values will be the values + # filled into the fields defined in field_dicts above ( 'Educational' -> 'Affiliation, + # 'Penn State' -> 'Name of Organization', '1' -> 'Contact for feedback' ) + email = 'test11@bx.psu.edu' + password = 'testuser' + username = 'test11' + user_info_values=[ 'Educational', 'Penn State', '1' ] + self.create_user_with_info( email=email, + password=password, + username=username, + user_info_select=str( form_one.id ), + user_info_values=user_info_values, + strings_displayed=[ "Create account", "User type" ] ) global regular_user11 - regular_user11 = get_user( 'test11@bx.psu.edu' ) - assert regular_user11 is not None, 'Problem retrieving user with email "test11@bx.psu.edu" from the database' + regular_user11 = get_user( email ) + assert regular_user11 is not None, 'Problem retrieving user with email "%s" from the database' % email global regular_user11_private_role regular_user11_private_role = get_private_role( regular_user11 ) self.logout() - self.login( email=regular_user11.email, username='regular-user11' ) - self.visit_url( "%s/user/show_info" % self.url ) - self.check_page_for_string( "Manage User Information" ) - self.check_page_for_string( user_info_values[0] ) - self.check_page_for_string( user_info_values[1] ) - self.check_page_for_string( '' ) + self.login( email=regular_user11.email, username=username ) + self.edit_user_info( strings_displayed=[ "Manage User Information", + user_info_values[0], + user_info_values[1], + '' ] ) def test_015_user_reqistration_single_user_info_forms( self ): - Testing user registration with a single user info form + """Testing user registration with a single user info form""" # Logged in as regular_user_11 self.logout() self.login( email=admin_user.email ) # Delete the 'Researcher' user info form - mark_form_deleted( form_two ) - self.visit_url( '%s/forms/manage?sort=create_time&f-deleted=True' % self.url ) - self.check_page_for_string( form_two.name ) - # Create a new user with 'Student' user info form - user_info_values=['Educational', 'Penn State', True] - self.create_user_with_info( 'test12@bx.psu.edu', 'testuser', 'test12', - user_info_forms='single', - user_info_form_id=form_one.id, - user_info_values=user_info_values ) + self.mark_form_deleted( self.security.encode_id( form_two.current.id ) ) + # Create a new user with 'Student' user info form. The user_info_values will be the values + # filled into the fields defined in field_dicts above ( 'Educational' -> 'Affiliation, + # 'Penn State' -> 'Name of Organization', '1' -> 'Contact for feedback' ) + email = 'test12@bx.psu.edu' + password = 'testuser' + username = 'test12' + user_info_values=[ 'Educational', 'Penn State', '1' ] + self.create_user_with_info( email=email, + password=password, + username=username, + user_info_select=form_one.id, + user_info_values=user_info_values, + strings_displayed=[ "Create account" ] ) global regular_user12 - regular_user12 = get_user( 'test12@bx.psu.edu' ) - assert regular_user12 is not None, 'Problem retrieving user with email "test12@bx.psu.edu" from the database' + regular_user12 = get_user( email ) + assert regular_user12 is not None, 'Problem retrieving user with email "%s" from the database' % email global regular_user12_private_role regular_user12_private_role = get_private_role( regular_user12 ) self.logout() - self.login( email=regular_user12.email, username='regular-user12' ) - self.visit_url( "%s/user/show_info" % self.url ) - self.check_page_for_string( "Manage User Information" ) - self.check_page_for_string( user_info_values[0] ) - self.check_page_for_string( user_info_values[1] ) - self.check_page_for_string( '' ) + self.login( email=regular_user12.email, username=username ) + self.edit_user_info( strings_displayed=[ "Manage User Information", + user_info_values[0], + user_info_values[1], + '' ] ) def test_020_edit_user_info( self ): - Testing editing user info as a regular user + """Testing editing user info as a regular user""" # Logged in as regular_user_12 # Test changing email and user name - first try an invalid user name - self.edit_login_info( new_email='test12_new@bx.psu.edu', - new_username='test12_new', - strings_displayed=[ "User name must contain only lower-case letters, numbers and '-'" ] ) + self.edit_user_info( new_email='test12_new@bx.psu.edu', + new_username='test12_new', + strings_displayed_after_submit=[ "Public names must be at least four characters" ] ) # Now try a valid user name - self.edit_login_info( new_email='test12_new@bx.psu.edu', - new_username='test12-new', - strings_displayed=[ 'The login information has been updated with the changes' ] ) + self.edit_user_info( new_email='test12_new@bx.psu.edu', + new_username='test12-new', + strings_displayed_after_submit=[ 'The login information has been updated with the changes' ] ) # Since we changed the user's account. make sure the user's private role was changed accordingly if not get_private_role( regular_user12 ): raise AssertionError, "The private role for %s was not correctly set when their account (email) was changed" % regular_user12.email # Test changing password - self.change_password( 'testuser', 'testuser#' ) + self.edit_user_info( password='testuser', + new_password='testuser#',\ + strings_displayed_after_submit=[ 'The password has been changed.' ] ) self.logout() refresh( regular_user12 ) # Test logging in with new email and password self.login( email=regular_user12.email, password='testuser#' ) # Test editing the user info - self.edit_user_info( ['Research', 'PSU'] ) + self.edit_user_info( info_values=[ 'Research', 'PSU' ], + strings_displayed_after_submit=[ "The user information has been updated with the changes" ] ) def test_999_reset_data_for_later_test_runs( self ): - Reseting data to enable later test runs to pass + """Reseting data to enable later test runs to pass""" # Logged in as regular_user_12 self.logout() self.login( email=admin_user.email ) ################## - # Mark all forms deleted + # Mark all forms deleted that have not yet been marked deleted ( form_two has ) ################## - for form in [ form_one, form_two ]: - self.mark_form_deleted( form ) + for form in [ form_one ]: + self.mark_form_deleted( self.security.encode_id( form.current.id ) ) ############### # Purge appropriate users ############### @@ -193,4 +208,3 @@ class TestUserInfo( TwillTestCase ): refresh( user ) delete_user_roles( user ) delete_obj( user ) - """