2017-10-09 09:04:46 +08:00
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
RSpec.describe EmailController do
|
2018-04-16 12:44:43 +08:00
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
let(:topic) { Fabricate(:topic) }
|
|
|
|
let(:private_topic) { Fabricate(:private_message_topic) }
|
|
|
|
|
2018-05-22 07:06:46 +08:00
|
|
|
context '.perform unsubscribe' do
|
|
|
|
it 'raises not found on invalid key' do
|
|
|
|
post "/email/unsubscribe/123.json"
|
|
|
|
expect(response.status).to eq(404)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can fully unsubscribe' do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
key = UnsubscribeKey.create_key_for(user, "all")
|
|
|
|
|
|
|
|
user.user_option.update_columns(email_always: true,
|
|
|
|
email_digests: true,
|
|
|
|
email_direct: true,
|
|
|
|
email_private_messages: true)
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { unsubscribe_all: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
get response.redirect_url
|
|
|
|
|
|
|
|
# cause it worked ... yay
|
|
|
|
expect(body).to include(user.email)
|
|
|
|
|
|
|
|
user.user_option.reload
|
|
|
|
|
|
|
|
expect(user.user_option.email_always).to eq(false)
|
|
|
|
expect(user.user_option.email_digests).to eq(false)
|
|
|
|
expect(user.user_option.email_direct).to eq(false)
|
|
|
|
expect(user.user_option.email_private_messages).to eq(false)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can disable mailing list' do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
key = UnsubscribeKey.create_key_for(user, "all")
|
|
|
|
|
|
|
|
user.user_option.update_columns(mailing_list_mode: true)
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { disable_mailing_list: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
user.user_option.reload
|
|
|
|
|
|
|
|
expect(user.user_option.mailing_list_mode).to eq(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can disable digest' do
|
|
|
|
user = Fabricate(:user)
|
|
|
|
key = UnsubscribeKey.create_key_for(user, "all")
|
|
|
|
|
|
|
|
user.user_option.update_columns(email_digests: true)
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { disable_digest_emails: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
user.user_option.reload
|
|
|
|
|
|
|
|
expect(user.user_option.email_digests).to eq(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can unwatch topic' do
|
|
|
|
p = Fabricate(:post)
|
|
|
|
key = UnsubscribeKey.create_key_for(p.user, p)
|
|
|
|
|
|
|
|
TopicUser.change(p.user_id, p.topic_id, notification_level: TopicUser.notification_levels[:watching])
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { unwatch_topic: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
expect(TopicUser.get(p.topic, p.user).notification_level).to eq(TopicUser.notification_levels[:tracking])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can mute topic' do
|
|
|
|
p = Fabricate(:post)
|
|
|
|
key = UnsubscribeKey.create_key_for(p.user, p)
|
|
|
|
|
|
|
|
TopicUser.change(p.user_id, p.topic_id, notification_level: TopicUser.notification_levels[:watching])
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { mute_topic: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
expect(TopicUser.get(p.topic, p.user).notification_level).to eq(TopicUser.notification_levels[:muted])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can unwatch category' do
|
|
|
|
p = Fabricate(:post)
|
|
|
|
key = UnsubscribeKey.create_key_for(p.user, p)
|
|
|
|
|
|
|
|
cu = CategoryUser.create!(user_id: p.user.id,
|
|
|
|
category_id: p.topic.category_id,
|
|
|
|
notification_level: CategoryUser.notification_levels[:watching])
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { unwatch_category: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
expect(CategoryUser.find_by(id: cu.id)).to eq(nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'can unwatch first post from category' do
|
|
|
|
p = Fabricate(:post)
|
|
|
|
key = UnsubscribeKey.create_key_for(p.user, p)
|
|
|
|
|
|
|
|
cu = CategoryUser.create!(user_id: p.user.id,
|
|
|
|
category_id: p.topic.category_id,
|
|
|
|
notification_level: CategoryUser.notification_levels[:watching_first_post])
|
|
|
|
|
|
|
|
post "/email/unsubscribe/#{key}.json",
|
|
|
|
params: { unwatch_category: "1" }
|
|
|
|
|
|
|
|
expect(response.status).to eq(302)
|
|
|
|
|
|
|
|
expect(CategoryUser.find_by(id: cu.id)).to eq(nil)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-09 09:04:46 +08:00
|
|
|
describe '#unsubscribed' do
|
|
|
|
describe 'when email is invalid' do
|
|
|
|
it 'should return the right response' do
|
|
|
|
get '/email/unsubscribed', params: { email: 'somerandomstring' }
|
|
|
|
expect(response.status).to eq(404)
|
|
|
|
end
|
|
|
|
end
|
2018-04-16 12:44:43 +08:00
|
|
|
|
|
|
|
describe 'when topic is public' do
|
|
|
|
it 'should return the right response' do
|
2018-05-22 07:06:46 +08:00
|
|
|
key = SecureRandom.hex
|
|
|
|
$redis.set(key, user.email)
|
|
|
|
get '/email/unsubscribed', params: { key: key, topic_id: topic.id }
|
2018-04-16 12:44:43 +08:00
|
|
|
expect(response).to be_success
|
|
|
|
expect(response.body).to include(topic.title)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'when topic is private' do
|
|
|
|
it 'should return the right response' do
|
2018-05-22 07:06:46 +08:00
|
|
|
key = SecureRandom.hex
|
|
|
|
$redis.set(key, user.email)
|
|
|
|
get '/email/unsubscribed', params: { key: key, topic_id: private_topic.id }
|
2018-04-16 12:44:43 +08:00
|
|
|
expect(response).to be_success
|
|
|
|
expect(response.body).to_not include(private_topic.title)
|
|
|
|
end
|
|
|
|
end
|
2017-10-09 09:04:46 +08:00
|
|
|
end
|
|
|
|
end
|