add column type

This commit is contained in:
simon lehericey 2024-10-07 15:00:22 +02:00
parent d51d3fd8ad
commit 693629afc8
No known key found for this signature in database
GPG key ID: CDE670D827C7B3C5
4 changed files with 115 additions and 0 deletions

View file

@ -27,4 +27,8 @@ class Column
table:, column:, label:, classname:, type:, scope:, value_column:, filterable:, displayable: table:, column:, label:, classname:, type:, scope:, value_column:, filterable:, displayable:
} }
end end
def self.find(h_id)
Procedure.with_discarded.find(h_id[:procedure_id]).find_column(h_id:)
end
end end

38
app/types/column_type.rb Normal file
View file

@ -0,0 +1,38 @@
# frozen_string_literal: true
class ColumnType < ActiveRecord::Type::Value
# value can come from:
# setter: column (Column),
# form_input: column.id == { procedure_id:, column_id: }.to_json (String),
# from db: { procedure_id:, column_id: } (Hash)
def cast(value)
case value
in NilClass
nil
in Column
value
# from form
in String => id
h_id = JSON.parse(id, symbolize_names: true)
Column.find(h_id)
# from db
in Hash => h_id
Column.find(h_id)
end
end
# db -> ruby
def deserialize(value) = cast(value)
# ruby -> db
def serialize(value)
case value
in NilClass
nil
in Column
JSON.generate(value.h_id)
else
raise ArgumentError, "Invalid value for Column serialization: #{value}"
end
end
end

View file

@ -1,7 +1,9 @@
# frozen_string_literal: true # frozen_string_literal: true
require Rails.root.join("app/types/column_type")
require Rails.root.join("app/types/export_item_type") require Rails.root.join("app/types/export_item_type")
ActiveSupport.on_load(:active_record) do ActiveSupport.on_load(:active_record) do
ActiveRecord::Type.register(:column, ColumnType)
ActiveRecord::Type.register(:export_item, ExportItemType) ActiveRecord::Type.register(:export_item, ExportItemType)
end end

View file

@ -0,0 +1,71 @@
# frozen_string_literal: true
describe ColumnType do
let(:type) { ColumnType.new }
describe 'cast' do
it 'from Column' do
column = Column.new(procedure_id: 1, table: 'table', column: 'column')
expect(type.cast(column)).to eq(column)
end
it 'from nil' do
expect(type.cast(nil)).to eq(nil)
end
describe 'from form' do
it 'with valid column id' do
column = Column.new(procedure_id: 1, table: 'table', column: 'column')
expect(Column).to receive(:find).with(column.h_id).and_return(column)
expect(type.cast(column.id)).to eq(column)
end
it 'with invalid column id' do
expect { type.cast('invalid') }.to raise_error(JSON::ParserError)
id = { procedure_id: 'invalid', column_id: 'nop' }.to_json
expect { type.cast(id) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
describe 'from db' do
it 'with valid column id' do
column = Column.new(procedure_id: 1, table: 'table', column: 'column')
expect(Column).to receive(:find).with(column.h_id).and_return(column)
expect(type.cast(column.h_id)).to eq(column)
end
it 'with invalid column id' do
h_id = { procedure_id: 'invalid', column_id: 'nop' }
expect { type.cast(h_id) }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end
describe 'deserialize' do
context 'with valid value' do
it 'works' do
column = Column.new(procedure_id: 1, table: 'table', column: 'column')
expect(Column).to receive(:find).with(column.h_id).and_return(column)
expect(type.deserialize(column.h_id)).to eq(column)
end
end
end
describe 'serialize' do
it 'with SortedColumn' do
column = Column.new(procedure_id: 1, table: 'table', column: 'column')
expect(type.serialize(column)).to eq(column.h_id.to_json)
end
it 'with nil' do
expect(type.serialize(nil)).to eq(nil)
end
it 'with invalid value' do
expect { type.serialize('invalid') }.to raise_error(ArgumentError)
end
end
end