Add spec for repository_table_state_service

This commit is contained in:
Luka Murn 2018-04-22 11:35:37 +02:00
parent 611a25ca9f
commit 9e106acf73
3 changed files with 160 additions and 1 deletions

View file

@ -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

View file

@ -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

View file

@ -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