fixtures :all
def create_with_attrs attrs
- a = Specimen.create({material: 'caloric'}.merge(attrs))
+ a = Collection.create({properties: {'foo' => 'bar'}}.merge(attrs))
a if a.valid?
end
test 'non-admin cannot assign uuid' do
set_user_from_auth :active_trustedclient
- want_uuid = Specimen.generate_uuid
+ want_uuid = Collection.generate_uuid
a = create_with_attrs(uuid: want_uuid)
assert_nil a, "Non-admin should not assign uuid."
end
test 'admin can assign valid uuid' do
set_user_from_auth :admin_trustedclient
- want_uuid = Specimen.generate_uuid
+ want_uuid = Collection.generate_uuid
a = create_with_attrs(uuid: want_uuid)
assert_equal want_uuid, a.uuid, "Admin should assign valid uuid."
assert a.uuid.length==27, "Auto assigned uuid length is wrong."
test 'admin cannot assign uuid with wrong object type' do
set_user_from_auth :admin_trustedclient
- want_uuid = Human.generate_uuid
+ want_uuid = Group.generate_uuid
a = create_with_attrs(uuid: want_uuid)
assert_nil a, "Admin should not be able to assign invalid uuid."
end
end
end
- test "Stringify symbols coming from serialized attribute in database" do
- set_user_from_auth :admin_trustedclient
- fixed = Link.find_by_uuid(links(:has_symbol_keys_in_database_somehow).uuid)
- assert_equal(["baz", "foo"], fixed.properties.keys.sort,
- "Hash symbol keys from DB did not get stringified.")
- assert_equal(['waz', 'waz', 'waz', 1, nil, false, true],
- fixed.properties['baz'],
- "Array symbol values from DB did not get stringified.")
- assert_equal true, fixed.save, "Failed to save fixed model back to db."
- end
-
test "No HashWithIndifferentAccess in database" do
set_user_from_auth :admin_trustedclient
link = Link.create!(link_class: 'test',
while longstring.length < 2**16
longstring = longstring + longstring
end
- g = Group.create! name: 'Has a long description', description: longstring
+ g = Group.create! name: 'Has a long description', description: longstring, group_class: "project"
g = Group.find_by_uuid g.uuid
assert_equal g.description, longstring
end
end
test "search index exists on models that go into projects" do
- all_tables = ActiveRecord::Base.connection.tables
- all_tables.delete 'schema_migrations'
- all_tables.delete 'permission_refresh_lock'
- all_tables.delete 'ar_internal_metadata'
+ all_tables = ActiveRecord::Base.connection.tables - [
+ 'ar_internal_metadata',
+ 'permission_refresh_lock',
+ 'schema_migrations',
+ # tables that may still exist in the database even though model
+ # classes have been deleted:
+ 'humans',
+ 'jobs',
+ 'job_tasks',
+ 'keep_disks',
+ 'nodes',
+ 'pipeline_instances',
+ 'pipeline_templates',
+ 'repositories',
+ 'specimens',
+ 'traits',
+ ]
all_tables.each do |table|
table_class = table.classify.constantize
end
end
- test "full text search index exists on models" do
- indexes = {}
- conn = ActiveRecord::Base.connection
- conn.exec_query("SELECT i.relname as indname,
- i.relowner as indowner,
- idx.indrelid::regclass::text as table,
- am.amname as indam,
- idx.indkey,
- ARRAY(
- SELECT pg_get_indexdef(idx.indexrelid, k + 1, true)
- FROM generate_subscripts(idx.indkey, 1) as k
- ORDER BY k
- ) as keys,
- idx.indexprs IS NOT NULL as indexprs,
- idx.indpred IS NOT NULL as indpred
- FROM pg_index as idx
- JOIN pg_class as i
- ON i.oid = idx.indexrelid
- JOIN pg_am as am
- ON i.relam = am.oid
- JOIN pg_namespace as ns
- ON ns.oid = i.relnamespace
- AND ns.nspname = ANY(current_schemas(false))").each do |idx|
- if idx['keys'].match(/to_tsvector/)
- indexes[idx['table']] ||= []
- indexes[idx['table']] << idx
- end
- end
- fts_tables = ["collections", "container_requests", "groups", "jobs",
- "pipeline_instances", "pipeline_templates", "workflows"]
- fts_tables.each do |table|
+ [
+ %w[collections collections_trgm_text_search_idx],
+ %w[container_requests container_requests_trgm_text_search_idx],
+ %w[groups groups_trgm_text_search_idx],
+ %w[workflows workflows_trgm_text_search_idx]
+ ].each do |model|
+ table = model[0]
+ indexname = model[1]
+ test "trigram index exists on #{table} model" do
table_class = table.classify.constantize
- if table_class.respond_to?('full_text_searchable_columns')
- expect = table_class.full_text_searchable_columns
- ok = false
- indexes[table].andand.each do |idx|
- if expect == idx['keys'].scan(/COALESCE\(([A-Za-z_]+)/).flatten
- ok = true
- end
- end
- assert ok, "#{table} has no full-text index\nexpect: #{expect.inspect}\nfound: #{indexes[table].inspect}"
+ expect = table_class.full_text_searchable_columns
+ ok = false
+ conn = ActiveRecord::Base.connection
+ conn.exec_query("SELECT indexdef FROM pg_indexes WHERE tablename = '#{table}' AND indexname = '#{indexname}'").each do |res|
+ searchable = res['indexdef'].scan(/COALESCE\(+([A-Za-z_]+)/).flatten
+ ok = (expect == searchable)
+ assert ok, "Invalid or no trigram index on #{table} named #{indexname}\nexpect: #{expect.inspect}\nfound: #{searchable}"
end
end
end
test "selectable_attributes includes database attributes" do
- assert_includes(Job.selectable_attributes, "success")
+ assert_includes(Collection.selectable_attributes, "name")
end
test "selectable_attributes includes non-database attributes" do
- assert_includes(Job.selectable_attributes, "node_uuids")
+ assert_includes(Collection.selectable_attributes, "unsigned_manifest_text")
end
test "selectable_attributes includes common attributes in extensions" do
- assert_includes(Job.selectable_attributes, "uuid")
+ assert_includes(Collection.selectable_attributes, "uuid")
end
test "selectable_attributes does not include unexposed attributes" do
- refute_includes(Job.selectable_attributes, "nodes")
+ refute_includes(Collection.selectable_attributes, "id")
end
test "selectable_attributes on a non-default template" do
- attr_a = Job.selectable_attributes(:common)
+ attr_a = Collection.selectable_attributes(:common)
assert_includes(attr_a, "uuid")
- refute_includes(attr_a, "success")
+ refute_includes(attr_a, "name")
end
test 'create and retrieve using created_at time' do
set_user_from_auth :active
- group = Group.create! name: 'test create and retrieve group'
+ group = Group.create! name: 'test create and retrieve group', group_class: "project"
assert group.valid?, "group is not valid"
results = Group.where(created_at: group.created_at)
test 'create and update twice and expect different update times' do
set_user_from_auth :active
- group = Group.create! name: 'test create and retrieve group'
+ group = Group.create! name: 'test create and retrieve group', group_class: "project"
assert group.valid?, "group is not valid"
# update 1
- group.update_attributes!(name: "test create and update name 1")
+ group.update!(name: "test create and update name 1")
results = Group.where(uuid: group.uuid)
assert_equal "test create and update name 1", results.first.name, "Expected name to be updated to 1"
updated_at_1 = results.first.updated_at.to_f
# update 2
- group.update_attributes!(name: "test create and update name 2")
+ group.update!(name: "test create and update name 2")
results = Group.where(uuid: group.uuid)
assert_equal "test create and update name 2", results.first.name, "Expected name to be updated to 2"
updated_at_2 = results.first.updated_at.to_f
c = Collection.create!(properties: {})
assert_equal({}, c.properties)
- c.update_attributes(properties: {'foo' => 'foo'})
+ c.update(properties: {'foo' => 'foo'})
c.reload
assert_equal({'foo' => 'foo'}, c.properties)
- c.update_attributes(properties: nil)
+ c.update(properties: nil)
c.reload
assert_equal({}, c.properties)
- c.update_attributes(properties: {foo: 'bar'})
+ c.update(properties: {foo: 'bar'})
assert_equal({'foo' => 'bar'}, c.properties)
c.reload
assert_equal({'foo' => 'bar'}, c.properties)
end
+
+ test 'serialized attributes dirty tracking with audit log settings' do
+ Rails.configuration.AuditLogs.MaxDeleteBatch = 1000
+ set_user_from_auth :admin
+ [false, true].each do |auditlogs_enabled|
+ if auditlogs_enabled
+ Rails.configuration.AuditLogs.MaxAge = 3600
+ else
+ Rails.configuration.AuditLogs.MaxAge = 0
+ end
+ tested_serialized = false
+ [
+ User.find_by_uuid(users(:active).uuid),
+ ContainerRequest.find_by_uuid(container_requests(:queued).uuid),
+ Container.find_by_uuid(containers(:queued).uuid),
+ Group.find_by_uuid(groups(:afiltergroup).uuid),
+ Collection.find_by_uuid(collections(:collection_with_one_property).uuid),
+ ].each do |obj|
+ if !obj.class.serialized_attributes.empty?
+ tested_serialized = true
+ end
+ # obj shouldn't have changed since it's just retrieved from the database
+ assert_not(obj.changed?, "#{obj.class} model's attribute(s) appear as changed: '#{obj.changes.keys.join(',')}' with audit logs #{auditlogs_enabled ? '': 'not '}enabled.")
+ end
+ assert(tested_serialized, "did not test any models with serialized attributes")
+ end
+ end
end