mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-09-20 14:45:56 +08:00
Add spec for repository_table_state_service
This commit is contained in:
parent
611a25ca9f
commit
9e106acf73
|
@ -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
|
|
@ -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
|
||||
|
|
50
spec/support/matchers/be_valid_default_repository_state.rb
Normal file
50
spec/support/matchers/be_valid_default_repository_state.rb
Normal 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
|
Loading…
Reference in a new issue