From 9e106acf73c6cc611581f13020c0b9b13b5991d0 Mon Sep 17 00:00:00 2001 From: Luka Murn Date: Sun, 22 Apr 2018 11:35:37 +0200 Subject: [PATCH] Add spec for repository_table_state_service --- .../repository_table_state_service_spec.rb | 108 +++++++++++++++++- spec/spec_helper.rb | 3 + .../be_valid_default_repository_state.rb | 50 ++++++++ 3 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 spec/support/matchers/be_valid_default_repository_state.rb diff --git a/spec/services/repository_table_state_service_spec.rb b/spec/services/repository_table_state_service_spec.rb index 7e55c51c6..4a8a84c08 100644 --- a/spec/services/repository_table_state_service_spec.rb +++ b/spec/services/repository_table_state_service_spec.rb @@ -1,5 +1,111 @@ require 'rails_helper' describe RepositoryTableStateService do - # TODO + let!(:team) { create :team } + let!(:user) { create :user, email: 'user_one@asdf.com' } + let!(:repository) do + create :repository, name: 'my repo', + created_by: user, + team: team + end + let!(:repository_column_1) do + create :repository_column, name: 'My column 1', + repository: repository, + data_type: :RepositoryTextValue + end + let!(:repository_column_2) do + create :repository_column, name: 'My column 2', + repository: repository, + data_type: :RepositoryAssetValue + end + let!(:repository_row) do + create :repository_row, name: 'A row', + repository: repository, + created_by: user, + last_modified_by: user + end + let!(:repository_row_two) do + create :repository_row, name: 'B row', + repository: repository, + created_by: user, + last_modified_by: user + end + let!(:service) do + RepositoryTableStateService.new(user, repository) + end + + describe '#create_default_state' do + let!(:initial_state) do + RepositoryTableState.create( + user: user, + repository: repository, + state: {} + ) + end + + context('record counts') do + let!(:query) do + RepositoryTableState.where(user: user, repository: repository) + end + + it 'deletes old entry and creates new entry that is returned' do + expect(query.count).to eq 1 + + new_state = service.create_default_state + + expect(query.reload.count).to eq 1 + expect(query.take).to eq new_state + end + + it 'always keeps one object per user-repository combination' do + expect(query.count).to eq 1 + + 5.times { service.create_default_state } + + expect(query.reload.count).to eq 1 + end + end + + it 'should have valid structure' do + record = service.create_default_state + + expect(record).to be_valid_default_repository_table_state(2) + end + end + + describe '#load_state' do + it 'should load initial state if it exists' do + initial_state = RepositoryTableState.create( + user: user, + repository: repository, + state: {} + ) + + record = service.load_state + expect(record).to eq initial_state + end + + it 'should load/create default state if it does not exist' do + RepositoryTableState.where(user: user, repository: repository).destroy_all + + record = service.load_state + expect(record).to be_valid_default_repository_table_state(2) + end + end + + describe '#update_state' do + let!(:new_state) do + { 'my' => 'state' } + end + + it 'should update the state' do + service.update_state(new_state) + + record = + RepositoryTableState.where(user: user, repository: repository).take + + expect(record).to be_truthy + expect(record.state).to eq new_state + end + end end \ No newline at end of file diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 969041d15..95350883c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -20,6 +20,9 @@ require 'active_record' require 'bullet' require "json_matchers/rspec" +# Require all custom matchers +Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each { |f| require f } + RSpec.configure do |config| # rspec-expectations config goes here. You can use an alternate # assertion/expectation library such as wrong or the stdlib/minitest diff --git a/spec/support/matchers/be_valid_default_repository_state.rb b/spec/support/matchers/be_valid_default_repository_state.rb new file mode 100644 index 000000000..b37baf61d --- /dev/null +++ b/spec/support/matchers/be_valid_default_repository_state.rb @@ -0,0 +1,50 @@ +require 'rspec/expectations' + +RSpec::Matchers.define :be_valid_default_repository_table_state do |nr_of_cols| + match do |subject| + expect(subject).to be_truthy + expect(subject).to be_an_instance_of RepositoryTableState + + state = subject.state + + cols_length = 6 + nr_of_cols + cols_str_array = [*0..(5 + nr_of_cols)].collect(&:to_s) + + 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'] }, + 'search' => { + 'search' => '', + 'smart' => 'true', + 'regex' => 'false', + 'caseInsensitive' => 'true' + }, + 'ColReorder' => cols_str_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(val).to include( + 'visible' => 'true', + 'searchable' => (key == '0' ? 'false' : 'true'), + 'search' => { + '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 \ No newline at end of file