+
+ [
+ %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
+ 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(Collection.selectable_attributes, "name")
+ end
+
+ test "selectable_attributes includes non-database attributes" do
+ assert_includes(Collection.selectable_attributes, "unsigned_manifest_text")
+ end
+
+ test "selectable_attributes includes common attributes in extensions" do
+ assert_includes(Collection.selectable_attributes, "uuid")
+ end
+
+ test "selectable_attributes does not include unexposed attributes" do
+ refute_includes(Collection.selectable_attributes, "id")
+ end
+
+ test "selectable_attributes on a non-default template" do
+ attr_a = Collection.selectable_attributes(:common)
+ assert_includes(attr_a, "uuid")
+ 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_class: "project"
+ assert group.valid?, "group is not valid"
+
+ results = Group.where(created_at: group.created_at)
+ assert_includes results.map(&:uuid), group.uuid,
+ "Expected new group uuid in results when searched with its created_at timestamp"
+ end
+
+ 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_class: "project"
+ assert group.valid?, "group is not valid"
+
+ # update 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!(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
+
+ assert_equal true, (updated_at_2 > updated_at_1), "Expected updated time 2 to be newer than 1"
+ end
+
+ test 'jsonb column' do
+ set_user_from_auth :active
+
+ c = Collection.create!(properties: {})
+ assert_equal({}, c.properties)
+
+ c.update(properties: {'foo' => 'foo'})
+ c.reload
+ assert_equal({'foo' => 'foo'}, c.properties)
+
+ c.update(properties: nil)
+ c.reload
+ assert_equal({}, c.properties)
+
+ 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