mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2025-02-26 16:53:12 +08:00
Fix for API float parsing in the inventory number type column [SCI-5604]
This commit is contained in:
parent
6ad3f7b92f
commit
2b2b6f7774
3 changed files with 133 additions and 4 deletions
|
@ -19,11 +19,11 @@ class RepositoryNumberValue < ApplicationRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def data_changed?(new_data)
|
def data_changed?(new_data)
|
||||||
BigDecimal(new_data) != data
|
BigDecimal(new_data.to_s) != data
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_data!(new_data, user)
|
def update_data!(new_data, user)
|
||||||
self.data = BigDecimal(new_data)
|
self.data = BigDecimal(new_data.to_s)
|
||||||
self.last_modified_by = user
|
self.last_modified_by = user
|
||||||
save!
|
save!
|
||||||
end
|
end
|
||||||
|
@ -40,12 +40,12 @@ class RepositoryNumberValue < ApplicationRecord
|
||||||
|
|
||||||
def self.new_with_payload(payload, attributes)
|
def self.new_with_payload(payload, attributes)
|
||||||
value = new(attributes)
|
value = new(attributes)
|
||||||
value.data = BigDecimal(payload)
|
value.data = BigDecimal(payload.to_s)
|
||||||
value
|
value
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.import_from_text(text, attributes, _options = {})
|
def self.import_from_text(text, attributes, _options = {})
|
||||||
new(attributes.merge(data: BigDecimal(text)))
|
new(attributes.merge(data: BigDecimal(text.to_s)))
|
||||||
rescue ArgumentError
|
rescue ArgumentError
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
15
spec/factories/repository_number_values.rb
Normal file
15
spec/factories/repository_number_values.rb
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
FactoryBot.define do
|
||||||
|
factory :repository_number_value do
|
||||||
|
created_by { create :user }
|
||||||
|
last_modified_by { created_by }
|
||||||
|
data { Faker::Number.decimal(l_digits: 4, r_digits: 4) }
|
||||||
|
after(:build) do |repository_number_value|
|
||||||
|
repository_number_value.repository_cell ||= build(:repository_cell,
|
||||||
|
:number_value,
|
||||||
|
repository_number_value: repository_number_value)
|
||||||
|
repository_number_value.repository_cell.value = repository_number_value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -41,6 +41,7 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
@time_range_column = create(:repository_column, repository: @valid_inventory, data_type: :RepositoryTimeRangeValue)
|
@time_range_column = create(:repository_column, repository: @valid_inventory, data_type: :RepositoryTimeRangeValue)
|
||||||
@date_time_range_column = create(:repository_column,
|
@date_time_range_column = create(:repository_column,
|
||||||
repository: @valid_inventory, data_type: :RepositoryDateTimeRangeValue)
|
repository: @valid_inventory, data_type: :RepositoryDateTimeRangeValue)
|
||||||
|
@number_column = create(:repository_column, repository: @valid_inventory, data_type: :RepositoryNumberValue)
|
||||||
|
|
||||||
@valid_item = create(:repository_row, repository: @valid_inventory)
|
@valid_item = create(:repository_row, repository: @valid_inventory)
|
||||||
|
|
||||||
|
@ -76,6 +77,9 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
start_time: DateTime.now,
|
start_time: DateTime.now,
|
||||||
end_time: DateTime.now + 1.day,
|
end_time: DateTime.now + 1.day,
|
||||||
repository_cell_attributes: { repository_row: @valid_item, repository_column: @date_time_range_column })
|
repository_cell_attributes: { repository_row: @valid_item, repository_column: @date_time_range_column })
|
||||||
|
create(:repository_number_value,
|
||||||
|
data: 1234.5678,
|
||||||
|
repository_cell_attributes: { repository_row: @valid_item, repository_column: @number_column })
|
||||||
|
|
||||||
@valid_headers =
|
@valid_headers =
|
||||||
{ 'Authorization': 'Bearer ' + generate_token(@user.id),
|
{ 'Authorization': 'Bearer ' + generate_token(@user.id),
|
||||||
|
@ -192,6 +196,24 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@valid_number_body = {
|
||||||
|
data: {
|
||||||
|
type: 'inventory_cells',
|
||||||
|
attributes: {
|
||||||
|
column_id: @number_column.id,
|
||||||
|
value: 1234.5678
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@valid_number_as_text_body = {
|
||||||
|
data: {
|
||||||
|
type: 'inventory_cells',
|
||||||
|
attributes: {
|
||||||
|
column_id: @number_column.id,
|
||||||
|
value: '1234.5678'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@update_text_body = {
|
@update_text_body = {
|
||||||
data: {
|
data: {
|
||||||
id: @valid_item.repository_cells.where(repository_column: @text_column).first.id,
|
id: @valid_item.repository_cells.where(repository_column: @text_column).first.id,
|
||||||
|
@ -314,6 +336,26 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@update_number_body = {
|
||||||
|
data: {
|
||||||
|
id: @valid_item.repository_cells.where(repository_column: @number_column).first.id,
|
||||||
|
type: 'inventory_cells',
|
||||||
|
attributes: {
|
||||||
|
column_id: @number_column.id,
|
||||||
|
value: 8765.4321
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@update_number_as_text_body = {
|
||||||
|
data: {
|
||||||
|
id: @valid_item.repository_cells.where(repository_column: @number_column).first.id,
|
||||||
|
type: 'inventory_cells',
|
||||||
|
attributes: {
|
||||||
|
column_id: @number_column.id,
|
||||||
|
value: '8765.4321'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET inventory_cells, #index' do
|
describe 'GET inventory_cells, #index' do
|
||||||
|
@ -603,6 +645,42 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'Response with correct inventory cell, number cell' do
|
||||||
|
hash_body = nil
|
||||||
|
empty_item = create(:repository_row, repository: @valid_inventory)
|
||||||
|
post api_v1_team_inventory_item_cells_path(
|
||||||
|
team_id: @team.id,
|
||||||
|
inventory_id: @valid_inventory.id,
|
||||||
|
item_id: empty_item.id
|
||||||
|
), params: @valid_number_body.to_json, headers: @valid_headers
|
||||||
|
expect(response).to have_http_status 201
|
||||||
|
expect { hash_body = json }.not_to raise_exception
|
||||||
|
expect(hash_body[:data]).to match(
|
||||||
|
ActiveModelSerializers::SerializableResource
|
||||||
|
.new(RepositoryCell.last,
|
||||||
|
serializer: Api::V1::InventoryCellSerializer)
|
||||||
|
.as_json[:data]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'Response with correct inventory cell, text number cell' do
|
||||||
|
hash_body = nil
|
||||||
|
empty_item = create(:repository_row, repository: @valid_inventory)
|
||||||
|
post api_v1_team_inventory_item_cells_path(
|
||||||
|
team_id: @team.id,
|
||||||
|
inventory_id: @valid_inventory.id,
|
||||||
|
item_id: empty_item.id
|
||||||
|
), params: @valid_number_as_text_body.to_json, headers: @valid_headers
|
||||||
|
expect(response).to have_http_status 201
|
||||||
|
expect { hash_body = json }.not_to raise_exception
|
||||||
|
expect(hash_body[:data]).to match(
|
||||||
|
ActiveModelSerializers::SerializableResource
|
||||||
|
.new(RepositoryCell.last,
|
||||||
|
serializer: Api::V1::InventoryCellSerializer)
|
||||||
|
.as_json[:data]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
it 'When invalid request, payload mismatches column type' do
|
it 'When invalid request, payload mismatches column type' do
|
||||||
hash_body = nil
|
hash_body = nil
|
||||||
invalid_file_body = @valid_file_body.dup
|
invalid_file_body = @valid_file_body.dup
|
||||||
|
@ -855,6 +933,42 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it 'Response with correct inventory cell, number cell' do
|
||||||
|
hash_body = nil
|
||||||
|
patch api_v1_team_inventory_item_cell_path(
|
||||||
|
team_id: @team.id,
|
||||||
|
inventory_id: @valid_inventory.id,
|
||||||
|
item_id: @valid_item.id,
|
||||||
|
id: @valid_item.repository_cells.where(repository_column: @number_column).first.id
|
||||||
|
), params: @update_number_body.to_json, headers: @valid_headers
|
||||||
|
expect(response).to have_http_status 200
|
||||||
|
expect { hash_body = json }.not_to raise_exception
|
||||||
|
expect(hash_body[:data]).to match(
|
||||||
|
ActiveModelSerializers::SerializableResource
|
||||||
|
.new(@valid_item.repository_cells.where(repository_column: @number_column).first,
|
||||||
|
serializer: Api::V1::InventoryCellSerializer)
|
||||||
|
.as_json[:data]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'Response with correct inventory cell, text number cell' do
|
||||||
|
hash_body = nil
|
||||||
|
patch api_v1_team_inventory_item_cell_path(
|
||||||
|
team_id: @team.id,
|
||||||
|
inventory_id: @valid_inventory.id,
|
||||||
|
item_id: @valid_item.id,
|
||||||
|
id: @valid_item.repository_cells.where(repository_column: @number_column).first.id
|
||||||
|
), params: @update_number_as_text_body.to_json, headers: @valid_headers
|
||||||
|
expect(response).to have_http_status 200
|
||||||
|
expect { hash_body = json }.not_to raise_exception
|
||||||
|
expect(hash_body[:data]).to match(
|
||||||
|
ActiveModelSerializers::SerializableResource
|
||||||
|
.new(@valid_item.repository_cells.where(repository_column: @number_column).first,
|
||||||
|
serializer: Api::V1::InventoryCellSerializer)
|
||||||
|
.as_json[:data]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
it 'When invalid request, payload mismatches column type' do
|
it 'When invalid request, payload mismatches column type' do
|
||||||
hash_body = nil
|
hash_body = nil
|
||||||
invalid_file_body = @valid_file_body.dup
|
invalid_file_body = @valid_file_body.dup
|
||||||
|
|
Loading…
Reference in a new issue