X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/32926d6543e52daa4db8e47c2870bef4d6bdf71d..f824f854b26dbf5e6c1d10dc3eb4689349dd71fe:/services/api/test/unit/log_test.rb diff --git a/services/api/test/unit/log_test.rb b/services/api/test/unit/log_test.rb index ec0dc60b72..6bca80c778 100644 --- a/services/api/test/unit/log_test.rb +++ b/services/api/test/unit/log_test.rb @@ -43,7 +43,7 @@ class LogTest < ActiveSupport::TestCase assert_equal(event_type.to_s, log.event_type, "log event type mismatch") time_method, old_props_test, new_props_test = EVENT_TEST_METHODS[event_type] if time_method.nil? or (timestamp = thing.send(time_method)).nil? - assert(log.event_at.utc.to_i >= @start_time.utc.to_i, "log timestamp too old") + assert(log.event_at >= @start_time, "log timestamp too old") else assert_in_delta(timestamp, log.event_at, 1, "log timestamp mismatch") end @@ -54,12 +54,12 @@ class LogTest < ActiveSupport::TestCase yield props if block_given? end - def assert_auth_logged_with_clean_properties(auth, event_type) - assert_logged(auth, event_type) do |props| + def assert_logged_with_clean_properties(obj, event_type, excluded_attr) + assert_logged(obj, event_type) do |props| ['old_attributes', 'new_attributes'].map { |k| props[k] }.compact .each do |attributes| - refute_includes(attributes, 'api_token', - "auth log properties include sensitive API token") + refute_includes(attributes, excluded_attr, + "log properties includes #{excluded_attr}") end yield props if block_given? end @@ -224,34 +224,61 @@ class LogTest < ActiveSupport::TestCase auth.user = users(:spectator) auth.api_client = api_clients(:untrusted) auth.save! - assert_auth_logged_with_clean_properties(auth, :create) + assert_logged_with_clean_properties(auth, :create, 'api_token') auth.expires_at = Time.now auth.save! - assert_auth_logged_with_clean_properties(auth, :update) + assert_logged_with_clean_properties(auth, :update, 'api_token') auth.destroy - assert_auth_logged_with_clean_properties(auth, :destroy) + assert_logged_with_clean_properties(auth, :destroy, 'api_token') end test "use ownership and permission links to determine which logs a user can see" do + known_logs = [:noop, + :admin_changes_repository2, + :admin_changes_specimen, + :system_adds_foo_file, + :system_adds_baz, + :log_owned_by_active, + :crunchstat_for_running_job] + c = Log.readable_by(users(:admin)).order("id asc").each.to_a - assert_equal 6, c.size - assert_equal 1, c[0].id # no-op - assert_equal 2, c[1].id # admin changes repository foo, which is owned by active user - assert_equal 3, c[2].id # admin changes specimen owned_by_spectator - assert_equal 4, c[3].id # foo collection added, readable by active through link - assert_equal 5, c[4].id # baz collection added, readable by active and spectator through group 'all users' group membership - assert_equal 6, c[5].id # log_owned_by_active + assert_log_result c, known_logs, known_logs c = Log.readable_by(users(:active)).order("id asc").each.to_a - assert_equal 4, c.size - assert_equal 2, c[0].id # admin changes repository foo, which is owned by active user - assert_equal 4, c[1].id # foo collection added, readable by active through link - assert_equal 5, c[2].id # baz collection added, readable by active and spectator through group 'all users' group membership - assert_equal 6, c[3].id # log_owned_by_active + assert_log_result c, known_logs, [:admin_changes_repository2, # owned by active + :system_adds_foo_file, # readable via link + :system_adds_baz, # readable via 'all users' group + :log_owned_by_active, # log owned by active + :crunchstat_for_running_job] # log & job owned by active c = Log.readable_by(users(:spectator)).order("id asc").each.to_a - assert_equal 2, c.size - assert_equal 3, c[0].id # admin changes specimen owned_by_spectator - assert_equal 5, c[1].id # baz collection added, readable by active and spectator through group 'all users' group membership + assert_log_result c, known_logs, [:admin_changes_specimen, # owned by spectator + :system_adds_baz] # readable via 'all users' group + end + + def assert_log_result result, known_logs, expected_logs + # All of expected_logs must appear in result. Additional logs can + # appear too, but only if they are _not_ listed in known_logs + # (i.e., we do not make any assertions about logs not mentioned in + # either "known" or "expected".) + result_ids = result.collect &:id + expected_logs.each do |want| + assert_includes result_ids, logs(want).id + end + (known_logs - expected_logs).each do |notwant| + refute_includes result_ids, logs(notwant).id + end + end + + test "manifest_text not included in collection logs" do + act_as_system_user do + coll = Collection.create(manifest_text: ". acbd18db4cc2f85cedef654fccc4a4d8+3 0:3:foo\n") + assert_logged_with_clean_properties(coll, :create, 'manifest_text') + coll.name = "testing" + coll.save! + assert_logged_with_clean_properties(coll, :update, 'manifest_text') + coll.destroy + assert_logged_with_clean_properties(coll, :destroy, 'manifest_text') + end end end