mirror of
				https://github.com/scinote-eln/scinote-web.git
				synced 2025-10-31 16:49:40 +08:00 
			
		
		
		
	Fix failing tests for repository states [SCI-4070]
This commit is contained in:
		
							parent
							
								
									338b710d81
								
							
						
					
					
						commit
						73be1181ac
					
				
					 8 changed files with 156 additions and 196 deletions
				
			
		|  | @ -41,12 +41,12 @@ class RepositoryColumn < ApplicationRecord | |||
|     # Calculate old_column_index - this can only be done before | ||||
|     # record is deleted when we still have its index | ||||
|     old_column_index = ( | ||||
|       Constants::REPOSITORY_TABLE_DEFAULT_STATE[:length] + | ||||
|       Constants::REPOSITORY_TABLE_DEFAULT_STATE['length'] + | ||||
|       repository.repository_columns | ||||
|                 .order(id: :asc) | ||||
|                 .pluck(:id) | ||||
|                 .index(id) | ||||
|     ).to_s | ||||
|     ) | ||||
| 
 | ||||
|     # Perform the destroy itself | ||||
|     yield | ||||
|  |  | |||
|  | @ -16,13 +16,10 @@ class RepositoryTableStateColumnUpdateService | |||
|       index = state['columns'].count | ||||
| 
 | ||||
|       # Add new columns, ColReorder, length entries | ||||
|       state['columns'][index.to_s] = | ||||
|         HashUtil.deep_stringify_keys_and_values( | ||||
|           Constants::REPOSITORY_TABLE_STATE_CUSTOM_COLUMN_TEMPLATE | ||||
|         ) | ||||
|       state['ColReorder'] << index.to_s | ||||
|       state['length'] = (index + 1).to_s | ||||
|       state['time'] = Time.new.to_i.to_s | ||||
|       state['columns'][index] = Constants::REPOSITORY_TABLE_STATE_CUSTOM_COLUMN_TEMPLATE | ||||
|       state['ColReorder'] << index | ||||
|       state['length'] = (index + 1) | ||||
|       state['time'] = Time.new.to_i | ||||
|       table_state.save | ||||
|     end | ||||
|   end | ||||
|  | @ -36,40 +33,27 @@ class RepositoryTableStateColumnUpdateService | |||
|     ).find_each do |table_state| | ||||
|       state = table_state.state | ||||
| 
 | ||||
|       # old_column_index is a String! | ||||
| 
 | ||||
|       # Remove column from ColReorder, columns, length entries | ||||
|       state['columns'].delete(old_column_index) | ||||
|       state['columns'].keys.each do |index| | ||||
|         if index.to_i > old_column_index.to_i | ||||
|           state['columns'][(index.to_i - 1).to_s] = | ||||
|             state['columns'].delete(index.to_s) | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       state['columns'].delete_at(old_column_index) | ||||
|       state['ColReorder'].delete(old_column_index) | ||||
|       state['ColReorder'].map! do |index| | ||||
|         if index.to_i > old_column_index.to_i | ||||
|           (index.to_i - 1).to_s | ||||
|         if index > old_column_index | ||||
|           index - 1 | ||||
|         else | ||||
|           index | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       state['order'].reject! { |_, v| v[0] == old_column_index } | ||||
|       state['order'].each do |k, v| | ||||
|         state['order'][k] = [(v[0].to_i - 1).to_s, v[1]] if v[0].to_i > old_column_index.to_i | ||||
|       end | ||||
|       if state['order'].empty? | ||||
|       if state.dig('order', 0, 0) == old_column_index | ||||
|         # Fallback to default order if user had table ordered by | ||||
|         # the deleted column | ||||
|         state['order'] = HashUtil.deep_stringify_keys_and_values( | ||||
|           Constants::REPOSITORY_TABLE_DEFAULT_STATE[:order] | ||||
|         ) | ||||
|         state['order'] = Constants::REPOSITORY_TABLE_DEFAULT_STATE['order'] | ||||
|       elsif state.dig('order', 0, 0) > old_column_index | ||||
|         state['order'][0][0] -= 1 | ||||
|       end | ||||
| 
 | ||||
|       state['length'] = (state['length'].to_i - 1).to_s | ||||
|       state['time'] = Time.new.to_i.to_s | ||||
|       state['length'] = (state['length'] - 1) | ||||
|       state['time'] = Time.new.to_i | ||||
|       table_state.save | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ class RepositoryTableStateService | |||
| 
 | ||||
|   def update_state(state) | ||||
|     saved_state = load_state | ||||
|     state[:order][0] = [3, 'asc'] if state.dig(:order, 0, 0).to_i < 2 | ||||
|     state['order'][0] = [3, 'asc'] if state.dig('order', 0, 0).to_i < 2 | ||||
| 
 | ||||
|     return if saved_state.state.except('time') == state.except('time') | ||||
| 
 | ||||
|  | @ -46,21 +46,17 @@ class RepositoryTableStateService | |||
|   private | ||||
| 
 | ||||
|   def generate_default_state | ||||
|     default_columns_num = | ||||
|       Constants::REPOSITORY_TABLE_DEFAULT_STATE[:length] | ||||
|     default_columns_num = Constants::REPOSITORY_TABLE_DEFAULT_STATE['length'] | ||||
| 
 | ||||
|     # This state should be strings-only | ||||
|     state = Constants::REPOSITORY_TABLE_DEFAULT_STATE.with_indifferent_access | ||||
|     state = Constants::REPOSITORY_TABLE_DEFAULT_STATE.deep_dup | ||||
|     repository.repository_columns.each_with_index do |_, index| | ||||
|       real_index = default_columns_num + index | ||||
|       state['columns'][real_index.to_s] = | ||||
|         HashUtil.deep_stringify_keys_and_values( | ||||
|           Constants::REPOSITORY_TABLE_STATE_CUSTOM_COLUMN_TEMPLATE | ||||
|         ) | ||||
|       state['ColReorder'] << real_index.to_s | ||||
|       state['columns'][real_index] = Constants::REPOSITORY_TABLE_STATE_CUSTOM_COLUMN_TEMPLATE | ||||
|       state['ColReorder'] << real_index | ||||
|     end | ||||
|     state['length'] = state['columns'].length.to_s | ||||
|     state['time'] = Time.new.to_i.to_s | ||||
|     state['length'] = state['columns'].length | ||||
|     state['time'] = Time.new.to_i | ||||
|     state | ||||
|   end | ||||
| end | ||||
|  |  | |||
|  | @ -944,34 +944,34 @@ class Constants | |||
| 
 | ||||
|   # Repository default table state | ||||
|   REPOSITORY_TABLE_DEFAULT_STATE = { | ||||
|     time: 0, | ||||
|     start: 0, | ||||
|     length: 6, | ||||
|     order: [[2, 'asc']], # Default sorting by 'ID' column | ||||
|     search: { search: '', | ||||
|               smart: true, | ||||
|               regex: false, | ||||
|               caseInsensitive: true }, | ||||
|     columns: {}, | ||||
|     assigned: 'assigned', | ||||
|     ColReorder: [*0..5] | ||||
|     'time' => 0, | ||||
|     'start' => 0, | ||||
|     'length' => 6, | ||||
|     'order' => [[2, 'asc']], # Default sorting by 'ID' column | ||||
|     'search' => { 'search' => '', | ||||
|                   'smart' => true, | ||||
|                   'regex' => false, | ||||
|                   'caseInsensitive' => true }, | ||||
|     'columns' => [], | ||||
|     'assigned' => 'assigned', | ||||
|     'ColReorder' => [*0..5] | ||||
|   } | ||||
|   6.times do |i| | ||||
|     REPOSITORY_TABLE_DEFAULT_STATE[:columns][i] = { | ||||
|       visible: true, | ||||
|       searchable: i >= 1, # Checkboxes column is not searchable | ||||
|       search: { search: '', | ||||
|                 smart: true, | ||||
|                 regex: false, | ||||
|                 caseInsensitive: true } | ||||
|     REPOSITORY_TABLE_DEFAULT_STATE['columns'] << { | ||||
|       'visible' => true, | ||||
|       'searchable' => (i >= 1), # Checkboxes column is not searchable | ||||
|       'search' => { 'search' => '', | ||||
|                     'smart' => true, | ||||
|                     'regex' => false, | ||||
|                     'caseInsensitive' => true } | ||||
|     } | ||||
|   end | ||||
|   REPOSITORY_TABLE_DEFAULT_STATE.freeze | ||||
|   # For default custom column template, any searchable default | ||||
|   # column can be reused | ||||
|   REPOSITORY_TABLE_STATE_CUSTOM_COLUMN_TEMPLATE = | ||||
|     REPOSITORY_TABLE_DEFAULT_STATE[:columns][1].deep_dup | ||||
|                                                .freeze | ||||
|     REPOSITORY_TABLE_DEFAULT_STATE['columns'][1].deep_dup | ||||
|                                                 .freeze | ||||
| 
 | ||||
|   EXPORTABLE_ZIP_EXPIRATION_DAYS = 7 | ||||
| 
 | ||||
|  |  | |||
|  | @ -34,15 +34,15 @@ describe RepositoryTableStateColumnUpdateService do | |||
|                             last_modified_by: user_2 | ||||
|   end | ||||
|   let!(:default_order) do | ||||
|     { '0' => %w(2 asc) } | ||||
|     [[2, 'asc']] | ||||
|   end | ||||
|   let!(:default_column_def) do | ||||
|     { 'visible' => 'true', | ||||
|       'searchable' => 'true', | ||||
|     { 'visible' => true, | ||||
|       'searchable' => true, | ||||
|       'search' => { 'search' => '', | ||||
|                     'smart' => 'true', | ||||
|                     'regex' => 'false', | ||||
|                     'caseInsensitive' => 'true' } } | ||||
|                     'smart' => true, | ||||
|                     'regex' => false, | ||||
|                     'caseInsensitive' => true } } | ||||
|   end | ||||
|   let!(:service) do | ||||
|     subject | ||||
|  | @ -70,24 +70,24 @@ describe RepositoryTableStateColumnUpdateService do | |||
|     end | ||||
| 
 | ||||
|     it 'should calculate correct length' do | ||||
|       expect(initial_state_1.state['length']).to eq '8' | ||||
|       expect(initial_state_2.state['length']).to eq '8' | ||||
|       expect(initial_state_1.state['length']).to eq 8 | ||||
|       expect(initial_state_2.state['length']).to eq 8 | ||||
| 
 | ||||
|       service.update_states_with_new_column(repository) | ||||
|       service.update_states_with_new_column(repository) | ||||
| 
 | ||||
|       [user_1, user_2].each do |user| | ||||
|         state = RepositoryTableStateService.new(user, repository).load_state | ||||
|         expect(state.state['length']).to eq '10' | ||||
|         expect(state.state['length']).to eq 10 | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'should keep order as it was' do | ||||
|       initial_state_1.state['order'] = { '0' => %w(3 desc) } | ||||
|       initial_state_1.state['order'] = [[3, 'desc']] | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       initial_state_2.state['order'] = { '0' => %w(4 asc) } | ||||
|       initial_state_2.state['order'] = [[4, 'asc']] | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|       ) | ||||
|  | @ -96,20 +96,20 @@ describe RepositoryTableStateColumnUpdateService do | |||
|       service.update_states_with_new_column(repository) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['order']).to eq('0' => %w(3 desc)) | ||||
|       expect(state_1.state['order']).to eq([[3, 'desc']]) | ||||
|       state_2 = RepositoryTableStateService.new(user_2, repository).load_state | ||||
|       expect(state_2.state['order']).to eq('0' => %w(4 asc)) | ||||
|       expect(state_2.state['order']).to eq([[4, 'asc']]) | ||||
|     end | ||||
| 
 | ||||
|     it 'should keep search as it was' do | ||||
|       search_1 = { 'search' => 'lala1', 'smart' => 'true', 'regex' => 'false', | ||||
|                    'caseInsensitive' => 'true' } | ||||
|       search_1 = { 'search' => 'lala1', 'smart' => true, 'regex' => false, | ||||
|                    'caseInsensitive' => true } | ||||
|       initial_state_1.state['search'] = search_1 | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       search_2 = { 'search' => 'lala1', 'smart' => 'true', 'regex' => 'false', | ||||
|                    'caseInsensitive' => 'true' } | ||||
|       search_2 = { 'search' => 'lala1', 'smart' => true, 'regex' => false, | ||||
|                    'caseInsensitive' => true } | ||||
|       initial_state_2.state['search'] = search_2 | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|  | @ -133,22 +133,20 @@ describe RepositoryTableStateColumnUpdateService do | |||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['columns']).to eq( | ||||
|         cols_1.merge('8' => default_column_def, '9' => default_column_def) | ||||
|         cols_1.push(default_column_def, default_column_def) | ||||
|       ) | ||||
|       state_2 = RepositoryTableStateService.new(user_2, repository).load_state | ||||
|       expect(state_2.state['columns']).to eq( | ||||
|         cols_2.merge('8' => default_column_def, '9' => default_column_def) | ||||
|         cols_2.push(default_column_def, default_column_def) | ||||
|       ) | ||||
|     end | ||||
| 
 | ||||
|     it 'should keep column order as it was' do | ||||
|       initial_state_1.state['ColReorder'] = | ||||
|         %w(5 3 2 0 1 4 6 7) | ||||
|       initial_state_1.state['ColReorder'] = [5, 3, 2, 0, 1, 4, 6, 7] | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       initial_state_2.state['ColReorder'] = | ||||
|         %w(0 6 1 4 5 7 2 3) | ||||
|       initial_state_2.state['ColReorder'] = [0, 6, 1, 4, 5, 7, 2, 3] | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|       ) | ||||
|  | @ -157,13 +155,9 @@ describe RepositoryTableStateColumnUpdateService do | |||
|       service.update_states_with_new_column(repository) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['ColReorder']).to eq( | ||||
|         %w(5 3 2 0 1 4 6 7 8 9) | ||||
|       ) | ||||
|       expect(state_1.state['ColReorder']).to eq([5, 3, 2, 0, 1, 4, 6, 7, 8, 9]) | ||||
|       state_2 = RepositoryTableStateService.new(user_2, repository).load_state | ||||
|       expect(state_2.state['ColReorder']).to eq( | ||||
|         %w(0 6 1 4 5 7 2 3 8 9) | ||||
|       ) | ||||
|       expect(state_2.state['ColReorder']).to eq([0, 6, 1, 4, 5, 7, 2, 3, 8, 9]) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|  | @ -183,8 +177,8 @@ describe RepositoryTableStateColumnUpdateService do | |||
|       expect(initial_state_1).to be_valid_default_repository_table_state(2) | ||||
|       expect(initial_state_2).to be_valid_default_repository_table_state(2) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       [user_1, user_2].each do |user| | ||||
|         state = RepositoryTableStateService.new(user, repository).load_state | ||||
|  | @ -193,53 +187,53 @@ describe RepositoryTableStateColumnUpdateService do | |||
|     end | ||||
| 
 | ||||
|     it 'should calculate correct length' do | ||||
|       expect(initial_state_1.state['length']).to eq '8' | ||||
|       expect(initial_state_2.state['length']).to eq '8' | ||||
|       expect(initial_state_1.state['length']).to eq 8 | ||||
|       expect(initial_state_2.state['length']).to eq 8 | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       [user_1, user_2].each do |user| | ||||
|         state = RepositoryTableStateService.new(user, repository).load_state | ||||
|         expect(state.state['length']).to eq '6' | ||||
|         expect(state.state['length']).to eq 6 | ||||
|       end | ||||
|     end | ||||
| 
 | ||||
|     it 'should keep order as it was' do | ||||
|       initial_state_1.state['order'] = { '0' => %w(3 desc) } | ||||
|       initial_state_1.state['order'] = [[3, 'desc']] | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       initial_state_2.state['order'] = { '0' => %w(7 asc) } | ||||
|       initial_state_2.state['order'] = [[7, 'asc']] | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|       ) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['order']).to eq('0' => %w(3 desc)) | ||||
|       expect(state_1.state['order']).to eq([[3, 'desc']]) | ||||
|       state_2 = RepositoryTableStateService.new(user_2, repository).load_state | ||||
|       expect(state_2.state['order']).to eq(default_order) | ||||
|     end | ||||
| 
 | ||||
|     it 'should keep search as it was' do | ||||
|       search_1 = { 'search' => 'lala1', 'smart' => 'true', 'regex' => 'false', | ||||
|                    'caseInsensitive' => 'true' } | ||||
|       search_1 = { 'search' => 'lala1', 'smart' => true, 'regex' => false, | ||||
|                    'caseInsensitive' => true } | ||||
|       initial_state_1.state['search'] = search_1 | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       search_2 = { 'search' => 'lala1', 'smart' => 'true', 'regex' => 'false', | ||||
|                    'caseInsensitive' => 'true' } | ||||
|       search_2 = { 'search' => 'lala1', 'smart' => true, 'regex' => false, | ||||
|                    'caseInsensitive' => true } | ||||
|       initial_state_2.state['search'] = search_2 | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|       ) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['search']).to eq search_1 | ||||
|  | @ -249,20 +243,23 @@ describe RepositoryTableStateColumnUpdateService do | |||
| 
 | ||||
|     it 'should keep columns as they were' do | ||||
|       cols_1 = initial_state_1.state['columns'].deep_dup | ||||
|       cols_1['4']['visible'] = 'false' | ||||
|       cols_1[4]['visible'] = false | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state.merge('columns' => cols_1) | ||||
|       ) | ||||
|       cols_1.except!('6', '7') | ||||
|       cols_1.delete_at(6) | ||||
|       cols_1.delete_at(6) | ||||
| 
 | ||||
|       cols_2 = initial_state_2.state['columns'].deep_dup | ||||
|       cols_2['4']['searchable'] = 'false' | ||||
|       cols_2[4]['searchable'] = false | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state.merge('columns' => cols_2) | ||||
|       ) | ||||
|       cols_2.except!('6', '7') | ||||
|       cols_2.delete_at(6) | ||||
|       cols_2.delete_at(6) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['columns']).to eq cols_1 | ||||
|  | @ -272,26 +269,26 @@ describe RepositoryTableStateColumnUpdateService do | |||
| 
 | ||||
|     it 'should keep column order as it was' do | ||||
|       initial_state_1.state['ColReorder'] = | ||||
|         %w(5 3 2 0 1 4 6 7) | ||||
|         [5, 3, 2, 0, 1, 4, 6, 7] | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         initial_state_1.state | ||||
|       ) | ||||
|       initial_state_2.state['ColReorder'] = | ||||
|         %w(0 6 1 4 5 7 2 3) | ||||
|         [0, 6, 1, 4, 5, 7, 2, 3] | ||||
|       RepositoryTableStateService.new(user_2, repository).update_state( | ||||
|         initial_state_2.state | ||||
|       ) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, '6') | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
|       service.update_states_with_removed_column(repository, 6) | ||||
| 
 | ||||
|       state_1 = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state_1.state['ColReorder']).to eq( | ||||
|         %w(5 3 2 0 1 4) | ||||
|         [5, 3, 2, 0, 1, 4] | ||||
|       ) | ||||
|       state_2 = RepositoryTableStateService.new(user_2, repository).load_state | ||||
|       expect(state_2.state['ColReorder']).to eq( | ||||
|         %w(0 1 4 5 2 3) | ||||
|         [0, 1, 4, 5, 2, 3] | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
|  | @ -310,12 +307,12 @@ describe RepositoryTableStateColumnUpdateService do | |||
|     let!(:initial_state) do | ||||
|       state = RepositoryTableStateService.new(user_1, repository) | ||||
|                                          .create_default_state | ||||
|       state.state['order'] = { '0' => %w(8 desc) } | ||||
|       state.state['order'] = [[8, 'desc']] | ||||
|       (0..9).each do |idx| | ||||
|         state.state['columns'][idx.to_s]['search']['search'] = "search_#{idx}" | ||||
|         state.state['columns'][idx]['search']['search'] = "search_#{idx}" | ||||
|       end | ||||
|       state.state['ColReorder'] = | ||||
|         %w(0 1 2 9 8 4 7 3 5 6) | ||||
|         [0, 1, 2, 9, 8, 4, 7, 3, 5, 6] | ||||
|       RepositoryTableStateService.new(user_1, repository).update_state( | ||||
|         state.state | ||||
|       ) | ||||
|  | @ -330,33 +327,33 @@ describe RepositoryTableStateColumnUpdateService do | |||
|       state = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state).to be_valid_repository_table_state(5) | ||||
|       expect(state.state['ColReorder']).to eq( | ||||
|         %w(0 1 2 9 8 4 7 3 5 6 10) | ||||
|         [0, 1, 2, 9, 8, 4, 7, 3, 5, 6, 10] | ||||
|       ) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '7') | ||||
|       service.update_states_with_removed_column(repository, 7) | ||||
| 
 | ||||
|       state = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state).to be_valid_repository_table_state(4) | ||||
|       expect(state.state['ColReorder']).to eq( | ||||
|         %w(0 1 2 8 7 4 3 5 6 9) | ||||
|         [0, 1, 2, 8, 7, 4, 3, 5, 6, 9] | ||||
|       ) | ||||
|       expect(state.state['order']).to eq('0' => %w(7 desc)) | ||||
|       expect(state.state['order']).to eq([[7, 'desc']]) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '7') | ||||
|       service.update_states_with_removed_column(repository, 7) | ||||
| 
 | ||||
|       state = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state).to be_valid_repository_table_state(3) | ||||
|       expect(state.state['ColReorder']).to eq( | ||||
|         %w(0 1 2 7 4 3 5 6 8) | ||||
|         [0, 1, 2, 7, 4, 3, 5, 6, 8] | ||||
|       ) | ||||
|       expect(state.state['order']).to eq('0' => %w(2 asc)) | ||||
|       expect(state.state['order']).to eq([[2, 'asc']]) | ||||
| 
 | ||||
|       service.update_states_with_removed_column(repository, '7') | ||||
|       service.update_states_with_removed_column(repository, 7) | ||||
| 
 | ||||
|       state = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state).to be_valid_repository_table_state(2) | ||||
|       expect(state.state['ColReorder']).to eq( | ||||
|         %w(0 1 2 4 3 5 6 7) | ||||
|         [0, 1, 2, 4, 3, 5, 6, 7] | ||||
|       ) | ||||
| 
 | ||||
|       service.update_states_with_new_column(repository) | ||||
|  | @ -365,7 +362,7 @@ describe RepositoryTableStateColumnUpdateService do | |||
|       state = RepositoryTableStateService.new(user_1, repository).load_state | ||||
|       expect(state).to be_valid_repository_table_state(4) | ||||
|       expect(state.state['ColReorder']).to eq( | ||||
|         %w(0 1 2 4 3 5 6 7 8 9) | ||||
|         [0, 1, 2, 4, 3, 5, 6, 7, 8, 9] | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
|  |  | |||
|  | @ -88,7 +88,9 @@ describe RepositoryTableStateService do | |||
| 
 | ||||
|   describe '#update_state' do | ||||
|     let!(:new_state) do | ||||
|       { 'my' => 'state' } | ||||
|       initial_state = RepositoryTableStateService.new(user, repository).create_default_state | ||||
|       initial_state.state['columns'][3]['visible'] = false | ||||
|       initial_state.state | ||||
|     end | ||||
| 
 | ||||
|     it 'should update the state' do | ||||
|  |  | |||
|  | @ -8,43 +8,41 @@ RSpec::Matchers.define :be_valid_default_repository_table_state do |nr_of_cols| | |||
|     state = subject.state | ||||
| 
 | ||||
|     cols_length = 6 + nr_of_cols | ||||
|     cols_str_array = [*0..(5 + nr_of_cols)].collect(&:to_s) | ||||
|     cols_array = [*0..(5 + nr_of_cols)] | ||||
| 
 | ||||
|     expect(state).to be_an_instance_of Hash | ||||
|     expect(state).to include( | ||||
|       'time', | ||||
|       'columns', | ||||
|       'start' => '0', | ||||
|       'length' => cols_length.to_s, # 6 default columns + parameter | ||||
|       'order' => { '0'=> ['2', 'asc'] }, | ||||
|       'start' => 0, | ||||
|       'length' => cols_length, # 6 default columns + parameter | ||||
|       'order' => [[2, 'asc']], | ||||
|       'search' => { | ||||
|         'search' => '', | ||||
|         'smart' => 'true', | ||||
|         'regex' => 'false', | ||||
|         'caseInsensitive' => 'true' | ||||
|         'smart' => true, | ||||
|         'regex' => false, | ||||
|         'caseInsensitive' => true | ||||
|       }, | ||||
|       'ColReorder' => cols_str_array | ||||
|       'assigned' => 'assigned', | ||||
|       'ColReorder' => cols_array | ||||
|     ) | ||||
| 
 | ||||
|     expect(state['columns']).to be_an_instance_of Hash | ||||
|     expect(state['columns'].length).to eq (6 + nr_of_cols) | ||||
|     expect(state['columns'].keys.sort).to eq cols_str_array | ||||
|     state['columns'].each do |key, val| | ||||
|     expect(state['columns']).to be_an_instance_of Array | ||||
|     expect(state['columns'].length).to eq(6 + nr_of_cols) | ||||
|     state['columns'].each_with_index do |val, i| | ||||
|       expect(val).to include( | ||||
|         'visible' => 'true', | ||||
|         'searchable' => (key == '0' ? 'false' : 'true'), | ||||
|         'visible' => true, | ||||
|         'searchable' => (i != 0), | ||||
|         'search' => { | ||||
|           'search' => '', 'smart' => 'true', 'regex' => 'false', 'caseInsensitive' => 'true' | ||||
|           'search' => '', 'smart' => true, 'regex' => false, 'caseInsensitive' => true | ||||
|         } | ||||
|       ) | ||||
|     end | ||||
| 
 | ||||
|     expect(state['time']).to be_an_instance_of String | ||||
|     expect { Integer(state['time']) }.to_not raise_error | ||||
|     expect { Time.at(state['time'].to_i) }.to_not raise_error | ||||
|   end | ||||
| 
 | ||||
|   failure_message do | ||||
|     'expected to be valid default repository table state, but was not' | ||||
|   end | ||||
| end | ||||
| end | ||||
|  |  | |||
|  | @ -12,85 +12,68 @@ RSpec::Matchers.define :be_valid_repository_table_state do | |||
|       'time', 'order', 'start', 'length', 'search', 'columns', 'ColReorder' | ||||
|     ) | ||||
| 
 | ||||
|     expect(state['time']).to be_an_instance_of String | ||||
|     expect { Integer(state['time']) }.to_not raise_error | ||||
|     expect { Time.at(state['time'].to_i) }.to_not raise_error | ||||
|     expect(state['time']).to be_an_instance_of Integer | ||||
|     expect { Time.at(state['time']) }.to_not raise_error | ||||
| 
 | ||||
|     expect(state['start']).to eq "0" | ||||
|     expect(state['start']).to eq 0 | ||||
| 
 | ||||
|     expect { Integer(state['length']) }.to_not raise_error | ||||
|     cols_length = Integer(state['length']) | ||||
|     cols_length = state['length'] | ||||
| 
 | ||||
|     # There should always be at least 6 columns | ||||
|     expect(cols_length).to be >= 6 | ||||
| 
 | ||||
|     col_indexes = [] | ||||
|     expect(state['columns']).to be_an_instance_of Hash | ||||
|     expect(state['columns']).to be_an_instance_of Array | ||||
|     expect(state['columns'].length).to eq cols_length | ||||
|     state['columns'].each do |key, val| | ||||
|       expect(key).to be_an_instance_of String | ||||
|       expect { Integer(key) }.to_not raise_error | ||||
| 
 | ||||
|     state['columns'].each_with_index do |val, i| | ||||
|       expect(val).to be_an_instance_of Hash | ||||
|       expect(val).to include( | ||||
|         'search', 'visible', 'searchable' | ||||
|       ) | ||||
|       expect(val['visible']).to eq('true').or eq('false') | ||||
|       expect(val['searchable']).to eq('true').or eq('false') | ||||
|       expect(val['visible']).to eq(true).or eq(false) | ||||
|       expect(val['searchable']).to eq(true).or eq(false) | ||||
|       expect(val['search']).to be_an_instance_of Hash | ||||
|       expect(val['search']).to include( | ||||
|         'regex', 'smart', 'search', 'caseInsensitive' | ||||
|       ) | ||||
|       expect(val['search']['regex']).to eq('true').or eq('false') | ||||
|       expect(val['search']['smart']).to eq('true').or eq('false') | ||||
|       expect(val['search']['caseInsensitive']).to eq('true').or eq('false') | ||||
|       expect(val['search']['regex']).to eq(true).or eq(false) | ||||
|       expect(val['search']['smart']).to eq(true).or eq(false) | ||||
|       expect(val['search']['caseInsensitive']).to eq(true).or eq(false) | ||||
|       expect(val['search']['search']).to be_an_instance_of String | ||||
| 
 | ||||
|       col_indexes << Integer(key) | ||||
|       col_indexes << i | ||||
|     end | ||||
| 
 | ||||
|     col_indexes.sort! | ||||
| 
 | ||||
|     # Check if column indexes are 0..N | ||||
|     expect(col_indexes).to eq [*0..(cols_length - 1)] | ||||
| 
 | ||||
|     expect(state['order']).to be_an_instance_of Hash | ||||
|     expect(state['order']).to be_an_instance_of Array | ||||
|     expect(state['order'].length).to be > 0 | ||||
|     state['order'].each do |key, val| | ||||
|       expect(key).to be_an_instance_of String | ||||
|       expect { Integer(key) }.to_not raise_error | ||||
|     expect(state['order'][0]).to be_an_instance_of Array | ||||
|     expect(state['order'][0].length).to eq 2 | ||||
|     expect(state['order'][0][0]).to be_an_instance_of Integer | ||||
|     expect(state['order'][0][1]).to be_an_instance_of String | ||||
|     expect(state['order'][0][1]).to eq('asc').or eq('desc') | ||||
| 
 | ||||
|       expect(val).to be_an_instance_of Array | ||||
|       expect(val.length).to eq 2 | ||||
|       expect(val[0]).to be_an_instance_of String | ||||
|       expect { Integer(val[0]) }.to_not raise_error | ||||
|       expect(val[1]).to be_an_instance_of String | ||||
|       expect(val[1]).to eq('asc').or eq('desc') | ||||
| 
 | ||||
|       # Check that the ordering column exists in columns | ||||
|       expect(col_indexes).to include(Integer(val[0])) | ||||
|     end | ||||
|     # Check that the ordering column exists in columns | ||||
|     expect(col_indexes).to include(state['order'][0][0]) | ||||
| 
 | ||||
|     expect(state['search']).to be_an_instance_of Hash | ||||
|     expect(state['search']).to include( | ||||
|       'regex', 'smart', 'search', 'caseInsensitive' | ||||
|     ) | ||||
|     expect(state['search']['regex']).to eq('true').or eq('false') | ||||
|     expect(state['search']['smart']).to eq('true').or eq('false') | ||||
|     expect(state['search']['caseInsensitive']).to eq('true').or eq('false') | ||||
|     expect(state['search']['regex']).to eq(true).or eq(false) | ||||
|     expect(state['search']['smart']).to eq(true).or eq(false) | ||||
|     expect(state['search']['caseInsensitive']).to eq(true).or eq(false) | ||||
|     expect(state['search']['search']).to be_an_instance_of String | ||||
| 
 | ||||
|     expect(state['ColReorder']).to be_an_instance_of Array | ||||
|     expect(state['ColReorder'].length).to eq cols_length | ||||
|     state['ColReorder'].each do |col| | ||||
|       expect { Integer(col) }.to_not raise_error | ||||
| 
 | ||||
|     state['ColReorder'].each do |col| | ||||
|       # Column should be in the columns indexes | ||||
|       expect(col_indexes).to include (Integer(col)) | ||||
|       expect(col_indexes).to include(col) | ||||
|     end | ||||
|   end | ||||
| 
 | ||||
|   failure_message do | ||||
|     'expected to be valid repository table state, but was not' | ||||
|   end | ||||
| end | ||||
| end | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue