Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Metadata: Update values to strings #808

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions app/services/samples/metadata/update_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ def execute # rubocop:disable Metrics/MethodLength

validate_metadata_param

transform_metadata_keys

@sample.with_lock do
perform_metadata_update
@sample.save
Expand Down Expand Up @@ -69,14 +67,10 @@ def validate_metadata_param
I18n.t('services.samples.metadata.empty_metadata', sample_name: @sample.name)
end

def transform_metadata_keys
# Without transforming and downcasing keys,
# issues with overwritting can occur and multiples of the same key can appear
@metadata = @metadata.transform_keys { |key| key.to_s.downcase }
end

def perform_metadata_update
@metadata.each do |key, value|
key = key.to_s.downcase
value = value.to_s # remove data types
if value.blank?
if @sample.metadata.key?(key)
@sample.metadata.delete(key)
Expand Down
14 changes: 14 additions & 0 deletions db/migrate/20241003193845_update_metadata_values_to_text.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

# Update all metadata values to be text
class UpdateMetadataValuesToText < ActiveRecord::Migration[7.2]
def change
reversible do |dir|
dir.up do
execute <<~SQL.squish
UPDATE samples SET metadata = metadata::text::jsonb;
SQL
end
end
end
end
2 changes: 1 addition & 1 deletion db/schema.rb

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion db/seeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ def seed_namespace_group_links(user, namespace, group, group_access_level)
def fake_metadata # rubocop:disable Metrics/MethodLength
indsc_abbr = %w[SRR ERR DRR]
random_abbr = indsc_abbr.sample
random_date = Faker::Date.between(from: 2.years.ago.to_s, to: Time.zone.today)
random_date = Faker::Date.between(from: 2.years.ago, to: Time.zone.today)

{
'WGS_id' => Faker::Number.number(digits: 10),
Expand Down
Binary file modified test/fixtures/files/metadata/valid.xls
Binary file not shown.
Binary file modified test/fixtures/files/metadata/valid.xlsx
Binary file not shown.
2 changes: 1 addition & 1 deletion test/graphql/create_group_mutation_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ def setup

group = Group.last
# Top level group
assert_equal nil, group.parent
assert_nil group.parent
assert_equal 'new-group-one', group.path
assert_equal 'new-group-one', group.full_path
end
Expand Down
42 changes: 42 additions & 0 deletions test/graphql/update_sample_metadata_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -283,4 +283,46 @@ def setup
]
assert_equal expected_error, data['errors']
end

test 'updateSampleMetadata mutation should convert keys and values to strings and lower case them' do
result = IridaSchema.execute(UPDATE_SAMPLE_METADATA_BY_SAMPLE_ID_MUTATION,
context: { current_user: @user, token: @api_scope_token },
variables: { sampleId: @sample.to_global_id.to_s,
metadata: { integer: 1, True_Boolean: true, false_boolean: false,
date: Date.parse('2024-03-11'), string: 'A Test', empty: '',
nil: nil } })

assert_nil result['errors'], 'should work and have no errors.'

data = result['data']['updateSampleMetadata']

assert_not_empty data, 'updateSampleMetadata should be populated when no authorization errors'
assert_empty data['errors']

assert_not_empty data['status']
assert_not_empty data['status'][:added]
assert data['status'][:added].include?('integer')
assert data['status'][:added].include?('true_boolean')
assert data['status'][:added].include?('false_boolean')
assert data['status'][:added].include?('date')
assert data['status'][:added].include?('string')
assert_not data['status'][:added].include?('empty')
assert_not data['status'][:added].include?('nil')

assert_not_empty data['sample']
assert_not_empty data['sample']['metadata']
assert_not_empty data['sample']['metadata']['integer']
assert data['sample']['metadata'].include?('integer')
assert_equal '1', data['sample']['metadata']['integer']
assert data['sample']['metadata'].include?('true_boolean')
assert_equal 'true', data['sample']['metadata']['true_boolean']
assert data['sample']['metadata'].include?('false_boolean')
assert_equal 'false', data['sample']['metadata']['false_boolean']
assert data['sample']['metadata'].include?('date')
assert_equal '2024-03-11', data['sample']['metadata']['date']
assert data['sample']['metadata'].include?('string')
assert_equal 'A Test', data['sample']['metadata']['string']
assert_not data['sample']['metadata'].include?('empty')
assert_not data['sample']['metadata'].include?('nil')
end
end
20 changes: 12 additions & 8 deletions test/services/samples/metadata/file_import_service_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -139,13 +139,15 @@ def setup
xls = File.new('test/fixtures/files/metadata/valid.xls', 'r')
params = { file: xls, sample_id_column: 'sample_name' }
response = Samples::Metadata::FileImportService.new(@project.namespace, @john_doe, params).execute
assert_equal({ @sample1.name => { added: %w[metadatafield1 metadatafield2 metadatafield3],
assert_equal({ @sample1.name => { added: %w[metadatafield1 metadatafield2 metadatafield3 metadatafield4],
updated: [], deleted: [], not_updated: [], unchanged: [] },
@sample2.name => { added: %w[metadatafield1 metadatafield2 metadatafield3],
@sample2.name => { added: %w[metadatafield1 metadatafield2 metadatafield3 metadatafield4],
updated: [], deleted: [], not_updated: [], unchanged: [] } }, response)
assert_equal({ 'metadatafield1' => 10, 'metadatafield2' => 20, 'metadatafield3' => 30 },
assert_equal({ 'metadatafield1' => '10', 'metadatafield2' => '2024-01-04', 'metadatafield3' => 'true',
'metadatafield4' => 'A Test' },
@sample1.reload.metadata)
assert_equal({ 'metadatafield1' => 15, 'metadatafield2' => 25, 'metadatafield3' => 35 },
assert_equal({ 'metadatafield1' => '15', 'metadatafield2' => '2024-12-31', 'metadatafield3' => 'false',
'metadatafield4' => 'Another Test' },
@sample2.reload.metadata)
end

Expand All @@ -155,13 +157,15 @@ def setup
xlsx = File.new('test/fixtures/files/metadata/valid.xlsx', 'r')
params = { file: xlsx, sample_id_column: 'sample_name' }
response = Samples::Metadata::FileImportService.new(@project.namespace, @john_doe, params).execute
assert_equal({ @sample1.name => { added: %w[metadatafield1 metadatafield2 metadatafield3],
assert_equal({ @sample1.name => { added: %w[metadatafield1 metadatafield2 metadatafield3 metadatafield4],
updated: [], deleted: [], not_updated: [], unchanged: [] },
@sample2.name => { added: %w[metadatafield1 metadatafield2 metadatafield3],
@sample2.name => { added: %w[metadatafield1 metadatafield2 metadatafield3 metadatafield4],
updated: [], deleted: [], not_updated: [], unchanged: [] } }, response)
assert_equal({ 'metadatafield1' => 10, 'metadatafield2' => 20, 'metadatafield3' => 30 },
assert_equal({ 'metadatafield1' => '10', 'metadatafield2' => '2024-01-04', 'metadatafield3' => 'true',
'metadatafield4' => 'A Test' },
@sample1.reload.metadata)
assert_equal({ 'metadatafield1' => 15, 'metadatafield2' => 25, 'metadatafield3' => 35 },
assert_equal({ 'metadatafield1' => '15', 'metadatafield2' => '2024-12-31', 'metadatafield3' => 'false',
'metadatafield4' => 'Another Test' },
@sample2.reload.metadata)
end

Expand Down
4 changes: 2 additions & 2 deletions test/services/workflow_executions/completion_service_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -350,10 +350,10 @@ def setup # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
'organism' => 'the organism' }
old_metadata2 = { 'metadatafield2' => 'value2',
'organism' => 'some organism' }
new_metadata1 = { 'number' => 1,
new_metadata1 = { 'number' => '1',
'metadatafield1' => 'value1',
'organism' => 'an organism' }
new_metadata2 = { 'number' => 2,
new_metadata2 = { 'number' => '2',
'metadatafield2' => 'value2',
'organism' => 'a different organism' }
# Test start
Expand Down
2 changes: 1 addition & 1 deletion test/system/projects/samples_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1597,7 +1597,7 @@ class SamplesTest < ApplicationSystemTestCase
click_on I18n.t('shared.samples.metadata.file_imports.success.ok_button')
end

assert_selector 'table thead tr th', count: 9
assert_selector 'table thead tr th', count: 10
end

test 'should not import metadata via invalid file type' do
Expand Down
Loading