Add methods update_data, data_changed, formatted for all types off ColumnValues

This commit is contained in:
Urban Rotnik 2019-12-08 16:53:59 +01:00
parent 55b9a82ff0
commit 79a50860b6
28 changed files with 620 additions and 53 deletions

View file

@ -33,8 +33,13 @@ class RepositoryAssetValue < ApplicationRecord
end
def update_data!(new_data, user)
asset.file.attach(io: StringIO.new(Base64.decode64(new_data[:file_data].split(',')[1])),
filename: new_data[:file_name])
if new_data[:signed_url]
asset.update(file: new_data[:sigend_url])
else
asset.file.attach(io: StringIO.new(Base64.decode64(new_data[:file_data].split(',')[1])),
filename: new_data[:filename])
end
asset.last_modified_by = user
self.last_modified_by = user
asset.save! && save!

View file

@ -20,7 +20,7 @@ class RepositoryCell < ApplicationRecord
.where(repository_cells: { value_type: 'RepositoryNumberValue' })
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
belongs_to :repository_date_time_value,
belongs_to :repository_date_value,
(lambda do
includes(:repository_cell)
.where(repository_cells: { value_type: 'RepositoryDateValue' })
@ -60,6 +60,13 @@ class RepositoryCell < ApplicationRecord
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
belongs_to :repository_time_value,
(lambda do
includes(:repository_cell)
.where(repository_cells: { value_type: 'RepositoryTimeValue' })
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
belongs_to :repository_date_time_range_value,
(lambda do
includes(:repository_cell)
@ -67,6 +74,20 @@ class RepositoryCell < ApplicationRecord
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
belongs_to :repository_date_range_value,
(lambda do
includes(:repository_cell)
.where(repository_cells: { value_type: 'RepositoryDateRangeValue' })
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
belongs_to :repository_time_range_value,
(lambda do
includes(:repository_cell)
.where(repository_cells: { value_type: 'RepositoryTimeRangeValue' })
end),
optional: true, foreign_key: :value_id, inverse_of: :repository_cell
validates :repository_column,
inclusion: { in: (lambda do |cell|
cell.repository_row&.repository&.repository_columns || []

View file

@ -1,4 +1,13 @@
# frozen_string_literal: true
class RepositoryDateRangeValue < RepositoryDateTimeRangeValueBase
def data_changed?(new_data)
st = Time.zone.parse(new_data[:start_time])
et = Time.zone.parse(new_data[:end_time])
formatted != formatted(new_dates: [st, et])
end
def formatted(new_dates: nil)
super(:full_date, new_dates: new_dates)
end
end

View file

@ -1,4 +1,13 @@
# frozen_string_literal: true
class RepositoryDateTimeRangeValue < RepositoryDateTimeRangeValueBase
def data_changed?(new_data)
st = Time.zone.parse(new_data[:start_time])
et = Time.zone.parse(new_data[:end_time])
formatted != formatted(new_dates: [st, et])
end
def formatted(new_dates: nil)
super(:full_with_comma, new_dates: new_dates)
end
end

View file

@ -15,11 +15,31 @@ class RepositoryDateTimeRangeValueBase < ApplicationRecord
SORTABLE_COLUMN_NAME = 'repository_date_time_values.start_time'
SORTABLE_VALUE_INCLUDE = :repository_date_time_range_value
def formatted
data
def update_data!(new_data, user)
self.start_time = Time.zone.parse(new_data[:start_time])
self.end_time = Time.zone.parse(new_data[:end_time])
self.last_modified_by = user
save!
end
def data
[start_time, end_time].compact.join(' - ')
end
private
def formatted(format, new_dates: nil)
if new_dates&.any?
st = new_dates[0]
et = new_dates[1]
else
st = start_time
et = end_time
end
[
I18n.l(st, format: format),
I18n.l(et, format: format)
].compact.join(' - ')
end
end

View file

@ -1,4 +1,11 @@
# frozen_string_literal: true
class RepositoryDateTimeValue < RepositoryDateTimeValueBase
def data_changed?(new_data)
formatted != formatted(new_date: new_data)
end
def formatted(new_date: nil)
super(:full_with_comma, new_date: new_date)
end
end

View file

@ -15,23 +15,16 @@ class RepositoryDateTimeValueBase < ApplicationRecord
SORTABLE_COLUMN_NAME = 'repository_date_time_values.data'
SORTABLE_VALUE_INCLUDE = :repository_date_time_value
def formatted
data
end
def data_changed?(new_data)
new_data != data
end
def update_data!(new_data, user)
self.data = new_data
self.data = Time.zone.parse(new_data)
self.last_modified_by = user
save!
end
def self.new_with_payload(payload, attributes)
value = new(attributes)
value.data = payload
value
private
def formatted(format, new_date: nil)
d = new_date ? Time.zone.parse(new_date) : data
I18n.l(d, format: format)
end
end

View file

@ -1,4 +1,11 @@
# frozen_string_literal: true
class RepositoryDateValue < RepositoryDateTimeValueBase
def data_changed?(new_data)
formatted != formatted(new_date: new_data)
end
def formatted(new_date: nil)
super(:full_date, new_date: new_date)
end
end

View file

@ -18,6 +18,16 @@ class RepositoryStatusValue < ApplicationRecord
data
end
def data_changed?(new_data)
new_data.to_i != repository_status_item_id
end
def update_data!(new_data, user)
self.repository_status_item_id = new_data.to_i
self.last_modified_by = user
save!
end
def data
return nil unless repository_status_item

View file

@ -1,4 +1,13 @@
# frozen_string_literal: true
class RepositoryTimeRangeValue < RepositoryDateTimeRangeValueBase
def data_changed?(new_data)
st = Time.zone.parse(new_data[:start_time])
et = Time.zone.parse(new_data[:end_time])
formatted != formatted(new_dates: [st, et])
end
def formatted(new_dates: nil)
super(:time, new_dates: new_dates)
end
end

View file

@ -1,4 +1,11 @@
# frozen_string_literal: true
class RepositoryTimeValue < RepositoryDateTimeValueBase
def data_changed?(new_data)
formatted != formatted(new_date: new_data)
end
def formatted(new_date: nil)
super(:time, new_date: new_date)
end
end

View file

@ -1,14 +1,34 @@
# frozen_string_literal: true
FactoryBot.define do
factory :repository_date_time_range_value do
factory :repository_date_time_range_value_base do
created_by { create :user }
last_modified_by { created_by }
start_time { Time.zone.now }
end_time { Faker::Time.between(from: start_time, to: Time.zone.now + 3.days) }
end
factory :repository_date_time_range_value,
parent: :repository_date_time_range_value_base,
class: 'RepositoryDateTimeRangeValue' do
after(:build) do |value|
value.repository_cell ||= build(:repository_cell, :date_time_range_value, repository_date_time_range_value: value)
end
end
factory :repository_time_range_value,
parent: :repository_date_time_range_value_base,
class: 'RepositoryTimeRangeValue' do
after(:build) do |value|
value.repository_cell ||= build(:repository_cell, :time_range_value, repository_time_range_value: value)
end
end
factory :repository_date_range_value,
parent: :repository_date_time_range_value_base,
class: 'RepositoryDateRangeValue' do
after(:build) do |value|
value.repository_cell ||= build(:repository_cell, :date_range_value, repository_date_range_value: value)
end
end
end

View file

@ -2,6 +2,8 @@
FactoryBot.define do
factory :repository_asset_value do
created_by { create :user }
last_modified_by { created_by }
asset
after(:build) do |repository_asset_value|
repository_asset_value.repository_cell ||= build(:repository_cell,

View file

@ -18,6 +18,20 @@ FactoryBot.define do
end
end
trait :time_value do
repository_column { create :repository_column, :time_type, repository: repository_row.repository }
after(:build) do |repository_cell|
repository_cell.value ||= build(:repository_time_value, repository_cell: repository_cell)
end
end
trait :date_value do
repository_column { create :repository_column, :date_type, repository: repository_row.repository }
after(:build) do |repository_cell|
repository_cell.value ||= build(:repository_date_value, repository_cell: repository_cell)
end
end
trait :list_value do
repository_column { create :repository_column, :list_type, repository: repository_row.repository }
after(:build) do |repository_cell|
@ -46,6 +60,20 @@ FactoryBot.define do
end
end
trait :date_range_value do
repository_column { create :repository_column, :date_range_type, repository: repository_row.repository }
after(:build) do |repository_cell|
repository_cell.value ||= build(:repository_date_range_value, repository_cell: repository_cell)
end
end
trait :time_range_value do
repository_column { create :repository_column, :time_range_type, repository: repository_row.repository }
after(:build) do |repository_cell|
repository_cell.value ||= build(:repository_time_range_value, repository_cell: repository_cell)
end
end
trait :checkbox_value do
repository_column { create :repository_column, :date_time_range_type, repository: repository_row.repository }
after(:build) do |repository_cell|

View file

@ -12,4 +12,16 @@ FactoryBot.define do
value.repository_cell ||= build(:repository_cell, :date_time_value, repository_date_time_value: value)
end
end
factory :repository_time_value, parent: :repository_date_time_value_base, class: 'RepositoryTimeValue' do
after(:build) do |value|
value.repository_cell ||= build(:repository_cell, :time_value, repository_time_value: value)
end
end
factory :repository_date_value, parent: :repository_date_time_value_base, class: 'RepositoryDateValue' do
after(:build) do |value|
value.repository_cell ||= build(:repository_cell, :date_value, repository_date_value: value)
end
end
end

View file

@ -2,6 +2,9 @@
FactoryBot.define do
factory :repository_status_value do
created_by { create :user }
last_modified_by { created_by }
repository_status_item
end
end

View file

@ -42,4 +42,46 @@ describe RepositoryAssetValue, type: :model do
expect(repository_asset_value.reload.formatted).to eq 'test.jpg'
end
end
describe 'data_changed?' do
it do
expect(repository_asset_value.data_changed?(anything)).to be_truthy
end
end
describe 'update_data!' do
let(:user) { create :user }
let(:new_file_base64) do
{
file_data: 'data:image/png;base64, someImageDataHere',
filename: 'newFile.png'
}
end
let(:new_file_with_signed_url) do
{
signed_url: 'someUrl'
}
end
context 'when has signed_url' do
it 'should change last_modified_by and data' do
repository_asset_value.save
expect { repository_asset_value.update_data!(new_file_with_signed_url, user) }
.to(change { repository_asset_value.reload.last_modified_by.id }
.and(change { repository_asset_value.reload.data }))
end
end
context 'when has base464 file' do
it 'should change last_modified_by and data' do
repository_asset_value.save
expect { repository_asset_value.update_data!(new_file_base64, user) }
.to(change { repository_asset_value.reload.last_modified_by.id }
.and(change { repository_asset_value.reload.data }))
end
end
end
end

View file

@ -0,0 +1,44 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryDateRangeValue, type: :model do
let(:date_range_value) do
create :repository_date_range_value, start_time: Time.utc(2000, 10, 10), end_time: Time.utc(2000, 10, 11)
end
describe '.formatted' do
it 'prints date format with time' do
str = '10/10/2000 - 10/11/2000'
expect(date_range_value.formatted).to eq(str)
end
end
describe '.data_changed?' do
context 'when has different date value' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10).to_s,
end_time: Time.utc(2000, 10, 12).to_s
}
end
it do
expect(date_range_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same date value (but different time)' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10).to_s,
end_time: Time.utc(2000, 10, 11, 4, 11).to_s
}
end
it do
expect(date_range_value.data_changed?(new_values)).to be_falsey
end
end
end
end

View file

@ -0,0 +1,55 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryDateTimeRangeValueBase, type: :model do
let(:repository_date_time_range_value) { create :repository_date_time_range_value }
it 'is valid' do
expect(repository_date_time_range_value).to be_valid
end
describe 'Validations' do
describe '#repository_cell' do
it { is_expected.to validate_presence_of(:repository_cell) }
end
describe '#start_time' do
it { is_expected.to validate_presence_of(:start_time) }
end
describe '#end_time' do
it { is_expected.to validate_presence_of(:end_time) }
end
end
describe 'Associations' do
it { is_expected.to belong_to(:created_by).optional }
it { is_expected.to belong_to(:last_modified_by).optional }
it { is_expected.to have_one(:repository_cell) }
end
describe '.update_data!' do
let(:user) { create :user }
let(:new_times) do
{
start_time: Time.now.utc.to_s,
end_time: (Time.zone.now + 2.days).utc.to_s
}
end
it 'should change last_modified_by and dates' do
repository_date_time_range_value.save
expect { repository_date_time_range_value.update_data!(new_times, user) }
.to(change { repository_date_time_range_value.reload.last_modified_by.id }
.and(change { repository_date_time_range_value.reload.data }))
end
end
describe '.data' do
it 'returns start and end time' do
str = repository_date_time_range_value.start_time.to_s + ' - ' + repository_date_time_range_value.end_time.to_s
expect(repository_date_time_range_value.data).to eq(str)
end
end
end

View file

@ -3,29 +3,42 @@
require 'rails_helper'
describe RepositoryDateTimeRangeValue, type: :model do
let(:repository_date_time_range_value) { create :repository_date_time_range_value }
it 'is valid' do
expect(repository_date_time_range_value).to be_valid
let(:date_time_range_value) do
create :repository_date_time_range_value, start_time: Time.utc(2000, 10, 10), end_time: Time.utc(2000, 10, 11)
end
describe 'Validations' do
describe '#repository_cell' do
it { is_expected.to validate_presence_of(:repository_cell) }
end
describe '#start_time' do
it { is_expected.to validate_presence_of(:start_time) }
end
describe '#end_time' do
it { is_expected.to validate_presence_of(:end_time) }
describe '.formatted' do
it 'prints date format with time' do
str = '10/10/2000, 00:00 - 10/11/2000, 00:00'
expect(date_time_range_value.formatted).to eq(str)
end
end
describe 'Associations' do
it { is_expected.to belong_to(:created_by).optional }
it { is_expected.to belong_to(:last_modified_by).optional }
it { is_expected.to have_one(:repository_cell) }
describe '.data_changed?' do
context 'when has different datetime value' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10).to_s,
end_time: Time.utc(2000, 10, 12).to_s
}
end
it do
expect(date_time_range_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same datetime value' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10).to_s,
end_time: Time.utc(2000, 10, 11).to_s
}
end
it do
expect(date_time_range_value.data_changed?(new_values)).to be_falsey
end
end
end
end

View file

@ -0,0 +1,40 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryDateTimeValueBase, type: :model do
let(:repository_date_time_value) { build :repository_date_time_value }
it 'is valid' do
expect(repository_date_time_value).to be_valid
end
describe 'Validations' do
describe '#repository_cell' do
it { is_expected.to validate_presence_of(:repository_cell) }
end
describe '#data' do
it { is_expected.to validate_presence_of(:data) }
end
end
describe 'Associations' do
it { is_expected.to belong_to(:created_by).optional }
it { is_expected.to belong_to(:last_modified_by).optional }
it { is_expected.to have_one(:repository_cell) }
end
describe '.update_data!' do
let(:user) { create :user }
let(:new_data) { Time.now.utc.to_s }
it 'should change last_modified_by and dates' do
repository_date_time_value.save
expect { repository_date_time_value.update_data!(new_data, user) }
.to(change { repository_date_time_value.reload.last_modified_by.id }
.and(change { repository_date_time_value.reload.data }))
end
end
end

View file

@ -3,25 +3,32 @@
require 'rails_helper'
describe RepositoryDateTimeValue, type: :model do
let(:repository_date_time_value) { build :repository_date_time_value }
it 'is valid' do
expect(repository_date_time_value).to be_valid
let(:date_time_value) do
create :repository_date_time_value, data: Time.utc(2000, 10, 11, 1, 4)
end
describe 'Validations' do
describe '#repository_cell' do
it { is_expected.to validate_presence_of(:repository_cell) }
end
describe '#data' do
it { is_expected.to validate_presence_of(:data) }
describe '.formatted' do
it 'prints date format with date' do
str = '10/11/2000, 01:04'
expect(date_time_value.formatted).to eq(str)
end
end
describe 'Associations' do
it { is_expected.to belong_to(:created_by).optional }
it { is_expected.to belong_to(:last_modified_by).optional }
it { is_expected.to have_one(:repository_cell) }
describe '.data_changed?' do
context 'when has different datetime value' do
let(:new_values) { Time.utc(2000, 12, 11, 4, 14).to_s }
it do
expect(date_time_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same datetime value' do
let(:new_values) { Time.utc(2000, 10, 11, 1, 4).to_s }
it do
expect(date_time_value.data_changed?(new_values)).to be_falsey
end
end
end
end

View file

@ -0,0 +1,34 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryDateValue, type: :model do
let(:date_value) do
create :repository_date_value, data: Time.utc(2000, 10, 11)
end
describe '.formatted' do
it 'prints date format with date' do
str = '10/11/2000'
expect(date_value.formatted).to eq(str)
end
end
describe '.data_changed?' do
context 'when has different date value' do
let(:new_values) { Time.utc(2000, 12, 11, 4, 14).to_s }
it do
expect(date_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same date value (but different time)' do
let(:new_values) { Time.utc(2000, 10, 11, 4, 11).to_s }
it do
expect(date_value.data_changed?(new_values)).to be_falsey
end
end
end
end

View file

@ -52,4 +52,36 @@ RSpec.describe RepositoryListValue, type: :model do
expect(repository_list_value.reload.data).to be_nil
end
end
describe 'data_changed?' do
context 'when has new data' do
it do
expect(repository_list_value.data_changed?('-1')).to be_truthy
end
end
context 'when has same data' do
it do
repository_list_value.save
id = repository_list_value.repository_list_item.id
expect(repository_list_value.data_changed?(id)).to be_falsey
end
end
end
describe 'update_data!' do
let(:user) { create :user }
let(:new_list_item) do
create :repository_list_item, repository_column: repository_list_value.repository_list_item.repository_column
end
it 'should change last_modified_by and data' do
repository_list_value.save
expect { repository_list_value.update_data!(new_list_item.id, user) }
.to(change { repository_list_value.reload.last_modified_by.id }
.and(change { repository_list_value.reload.data }))
end
end
end

View file

@ -20,4 +20,37 @@ describe RepositoryStatusValue do
it { is_expected.to belong_to(:created_by).optional }
it { is_expected.to belong_to(:last_modified_by).optional }
end
describe '.data_changed?' do
context 'when has new data' do
it do
expect(repository_status_value.data_changed?('-1')).to be_truthy
end
end
context 'when has same data' do
it do
repository_status_value.save
id = repository_status_value.repository_status_item.id
expect(repository_status_value.data_changed?(id)).to be_falsey
end
end
end
describe '.update_data!' do
let(:user) { create :user }
let(:new_status_item) do
create :repository_status_item,
repository_column: repository_status_value.repository_status_item.repository_column
end
it 'should change last_modified_by and data' do
repository_status_value.save
expect { repository_status_value.update_data!(new_status_item.id, user) }
.to(change { repository_status_value.reload.last_modified_by.id }
.and(change { repository_status_value.reload.data }))
end
end
end

View file

@ -34,4 +34,31 @@ describe RepositoryTextValue, type: :model do
should validate_length_of(:data).is_at_most(Constants::TEXT_MAX_LENGTH)
end
end
describe 'data_changed?' do
context 'when has new data' do
it do
expect(repository_text_value.data_changed?('newData')).to be_truthy
end
end
context 'when has same data' do
it do
data = repository_text_value.data
expect(repository_text_value.data_changed?(data)).to be_falsey
end
end
end
describe 'update_data!' do
let(:user) { create :user }
it 'should change last_modified_by and data' do
repository_text_value.save
expect { repository_text_value.update_data!('newData', user) }
.to(change { repository_text_value.reload.last_modified_by.id }
.and(change { repository_text_value.reload.data }))
end
end
end

View file

@ -0,0 +1,44 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryTimeRangeValue, type: :model do
let(:time_range_value) do
create :repository_time_range_value, start_time: Time.utc(2000, 10, 10), end_time: Time.utc(2000, 10, 11, 4, 11)
end
describe '.formatted' do
it 'prints date format with time' do
str = '00:00 - 04:11'
expect(time_range_value.formatted).to eq(str)
end
end
describe '.data_changed?' do
context 'when has different time value' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10, 12, 13).to_s,
end_time: Time.utc(2000, 10, 12, 4, 11).to_s
}
end
it do
expect(time_range_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same time value (but different date)' do
let(:new_values) do
{
start_time: Time.utc(2000, 10, 10).to_s,
end_time: Time.utc(2012, 10, 14, 4, 11).to_s
}
end
it do
expect(time_range_value.data_changed?(new_values)).to be_falsey
end
end
end
end

View file

@ -0,0 +1,34 @@
# frozen_string_literal: true
require 'rails_helper'
describe RepositoryTimeValue, type: :model do
let(:time_value) do
create :repository_time_value, data: Time.utc(2000, 10, 11, 4, 11)
end
describe '.formatted' do
it 'prints date format with time' do
str = '04:11'
expect(time_value.formatted).to eq(str)
end
end
describe '.data_changed?' do
context 'when has different time value' do
let(:new_values) { Time.utc(2000, 10, 11, 4, 14).to_s }
it do
expect(time_value.data_changed?(new_values)).to be_truthy
end
end
context 'when has same time value (but different date)' do
let(:new_values) { Time.utc(1999, 10, 14, 4, 11).to_s }
it do
expect(time_value.data_changed?(new_values)).to be_falsey
end
end
end
end