require 'spec_helper'
describe 'event jobs' do
before do
@user = FactoryGirl.find_or_create(:jill)
@another_user = FactoryGirl.find_or_create(:archivist)
@third_user = FactoryGirl.find_or_create(:curator)
@gf = GenericFile.new(id: 'test-123')
@gf.apply_depositor_metadata(@user)
@gf.title = ['Hamlet']
@gf.save
end
after do
$redis.keys('events:*').each { |key| $redis.del key }
$redis.keys('User:*').each { |key| $redis.del key }
$redis.keys('GenericFile:*').each { |key| $redis.del key }
end
it "logs user edit profile events" do
# UserEditProfile should log the event to the editor's dashboard and his/her followers' dashboards
@another_user.follow(@user)
count_user = @user.events.length
count_another = @another_user.events.length
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has edited his or her profile', timestamp: '1' }
UserEditProfileEventJob.new(@user.user_key).run
expect(@user.events.length).to eq(count_user + 1)
expect(@user.events.first).to eq(event)
expect(@another_user.events.length).to eq(count_another + 1)
expect(@another_user.events.first).to eq(event)
end
it "logs user follow events" do
# UserFollow should log the event to the follower's dashboard, the followee's dashboard, and followers' dashboards
@third_user.follow(@user)
expect(@user.events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com is now following archivist1@example.com', timestamp: '1' }
UserFollowEventJob.new(@user.user_key, @another_user.user_key).run
expect(@user.events.length).to eq(1)
expect(@user.events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
end
it "logs user unfollow events" do
# UserUnfollow should log the event to the unfollower's dashboard, the unfollowee's dashboard, and followers' dashboards
@third_user.follow(@user)
@user.follow(@another_user)
expect(@user.events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has unfollowed archivist1@example.com', timestamp: '1' }
UserUnfollowEventJob.new(@user.user_key, @another_user.user_key).run
expect(@user.events.length).to eq(1)
expect(@user.events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
end
it "logs content deposit events" do
# ContentDeposit should log the event to the depositor's profile, followers' dashboards, and the GF
@another_user.follow(@user)
@third_user.follow(@user)
allow_any_instance_of(User).to receive(:can?).and_return(true)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(@gf.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has deposited Hamlet', timestamp: '1' }
ContentDepositEventJob.new('test-123', @user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
it "logs content depositor change events" do
# ContentDepositorChange should log the event to the proxy depositor's profile, the depositor's dashboard, followers' dashboards, and the GF
@third_user.follow(@another_user)
allow_any_instance_of(User).to receive(:can?).and_return(true)
allow(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has transferred Hamlet to user archivist1@example.com', timestamp: '1' }
ContentDepositorChangeEventJob.new('test-123', @another_user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
it "logs content update events" do
# ContentUpdate should log the event to the depositor's profile, followers' dashboards, and the GF
@another_user.follow(@user)
@third_user.follow(@user)
allow_any_instance_of(User).to receive(:can?).and_return(true)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(@gf.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has updated Hamlet', timestamp: '1' }
ContentUpdateEventJob.new('test-123', @user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
it "logs content new version events" do
# ContentNewVersion should log the event to the depositor's profile, followers' dashboards, and the GF
@another_user.follow(@user)
@third_user.follow(@user)
allow_any_instance_of(User).to receive(:can?).and_return(true)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(@gf.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has added a new version of Hamlet', timestamp: '1' }
ContentNewVersionEventJob.new('test-123', @user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
it "logs content restored version events" do
# ContentRestoredVersion should log the event to the depositor's profile, followers' dashboards, and the GF
@another_user.follow(@user)
@third_user.follow(@user)
allow_any_instance_of(User).to receive(:can?).and_return(true)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(@gf.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has restored a version \'content.0\' of Hamlet', timestamp: '1' }
ContentRestoredVersionEventJob.new('test-123', @user.user_key, 'content.0').run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
it "logs content delete events" do
# ContentDelete should log the event to the depositor's profile and followers' dashboards
@another_user.follow(@user)
@third_user.follow(@user)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(Time).to receive(:now).at_least(:once).and_return(1)
event = { action: 'User jilluser@example.com has deleted file \'test-123\'', timestamp: '1' }
ContentDeleteEventJob.new('test-123', @user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(1)
expect(@another_user.events.first).to eq(event)
expect(@third_user.events.length).to eq(1)
expect(@third_user.events.first).to eq(event)
end
it "does not log content-related jobs to followers who lack access" do
# No Content-related eventjobs should log an event to a follower who does not have access to the GF
@another_user.follow(@user)
@third_user.follow(@user)
expect(@user.profile_events.length).to eq(0)
expect(@another_user.events.length).to eq(0)
expect(@third_user.events.length).to eq(0)
expect(@gf.events.length).to eq(0)
@now = Time.now
expect(Time).to receive(:now).at_least(:once).and_return(@now)
event = { action: 'User jilluser@example.com has updated Hamlet', timestamp: @now.to_i.to_s }
ContentUpdateEventJob.new('test-123', @user.user_key).run
expect(@user.profile_events.length).to eq(1)
expect(@user.profile_events.first).to eq(event)
expect(@another_user.events.length).to eq(0)
expect(@another_user.events.first).to be_nil
expect(@third_user.events.length).to eq(0)
expect(@third_user.events.first).to be_nil
expect(@gf.events.length).to eq(1)
expect(@gf.events.first).to eq(event)
end
end