2024-10-21 18:11:43 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
describe "Creating Invites", type: :system do
|
|
|
|
fab!(:group)
|
|
|
|
fab!(:user) { Fabricate(:user, groups: [group]) }
|
|
|
|
fab!(:topic) { Fabricate(:post).topic }
|
|
|
|
let(:user_invited_pending_page) { PageObjects::Pages::UserInvitedPending.new }
|
|
|
|
let(:create_invite_modal) { PageObjects::Modals::CreateInvite.new }
|
|
|
|
let(:cdp) { PageObjects::CDP.new }
|
|
|
|
|
|
|
|
def open_invite_modal
|
|
|
|
find(".user-invite-buttons .btn", match: :first).click
|
|
|
|
end
|
|
|
|
|
|
|
|
def display_advanced_options
|
|
|
|
create_invite_modal.edit_options_link.click
|
|
|
|
end
|
|
|
|
|
|
|
|
before do
|
|
|
|
SiteSetting.invite_allowed_groups = "#{group.id}"
|
|
|
|
SiteSetting.invite_link_max_redemptions_limit_users = 7
|
|
|
|
SiteSetting.invite_link_max_redemptions_limit = 63
|
|
|
|
SiteSetting.invite_expiry_days = 3
|
|
|
|
sign_in(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
before do
|
|
|
|
user_invited_pending_page.visit(user)
|
|
|
|
open_invite_modal
|
|
|
|
end
|
|
|
|
|
|
|
|
it "is possible to create an invite link without toggling the advanced options" do
|
|
|
|
cdp.allow_clipboard
|
|
|
|
|
|
|
|
create_invite_modal.save_button.click
|
|
|
|
create_invite_modal.copy_button.click
|
|
|
|
|
|
|
|
invite_link = create_invite_modal.invite_link_input.value
|
|
|
|
invite_key = invite_link.split("/").last
|
|
|
|
|
|
|
|
cdp.clipboard_has_text?(invite_link)
|
|
|
|
|
|
|
|
expect(create_invite_modal.link_limits_info_paragraph).to have_text(
|
|
|
|
"Link is valid for up to 7 users and expires in 3 days.",
|
|
|
|
)
|
|
|
|
|
|
|
|
create_invite_modal.close
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.invites_list.size).to eq(1)
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.latest_invite).to be_link_type(
|
|
|
|
key: invite_key,
|
|
|
|
redemption_count: 0,
|
|
|
|
max_redemption_count: 7,
|
|
|
|
)
|
|
|
|
expect(user_invited_pending_page.latest_invite.expiry_date).to be_within(2.minutes).of(
|
|
|
|
Time.zone.now + 3.days,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the correct modal title when creating a new invite" do
|
|
|
|
expect(create_invite_modal.header).to have_text(I18n.t("js.user.invited.invite.new_title"))
|
|
|
|
end
|
|
|
|
|
|
|
|
it "hides the modal footer after creating an invite via simple mode" do
|
|
|
|
expect(create_invite_modal).to have_footer
|
|
|
|
create_invite_modal.save_button.click
|
|
|
|
expect(create_invite_modal).to have_no_footer
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when editing an invite" do
|
|
|
|
before do
|
|
|
|
create_invite_modal.save_button.click
|
|
|
|
create_invite_modal.close
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.invites_list.size).to eq(1)
|
|
|
|
|
|
|
|
user_invited_pending_page.latest_invite.edit_button.click
|
|
|
|
end
|
|
|
|
|
|
|
|
it "has the correct modal title" do
|
|
|
|
expect(create_invite_modal.header).to have_text(I18n.t("js.user.invited.invite.edit_title"))
|
|
|
|
end
|
|
|
|
|
|
|
|
it "displays the invite link and a copy button" do
|
|
|
|
expect(create_invite_modal).to have_copy_button
|
|
|
|
expect(create_invite_modal).to have_invite_link_input
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "with the advanced options" do
|
|
|
|
before { display_advanced_options }
|
|
|
|
|
|
|
|
it "is possible to populate all the fields" do
|
|
|
|
user.update!(admin: true)
|
|
|
|
page.refresh
|
|
|
|
open_invite_modal
|
|
|
|
display_advanced_options
|
|
|
|
|
|
|
|
create_invite_modal.form.field("restrictTo").fill_in("discourse.org")
|
|
|
|
create_invite_modal.form.field("maxRedemptions").fill_in("53")
|
|
|
|
create_invite_modal.form.field("expiresAfterDays").select(90)
|
|
|
|
|
|
|
|
create_invite_modal.choose_topic(topic)
|
|
|
|
create_invite_modal.choose_groups([group])
|
|
|
|
|
|
|
|
create_invite_modal.save_button.click
|
|
|
|
|
|
|
|
expect(create_invite_modal).to have_copy_button
|
|
|
|
|
|
|
|
invite_link = create_invite_modal.invite_link_input.value
|
|
|
|
invite_key = invite_link.split("/").last
|
|
|
|
|
|
|
|
create_invite_modal.close
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.invites_list.size).to eq(1)
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.latest_invite).to be_link_type(
|
|
|
|
key: invite_key,
|
|
|
|
redemption_count: 0,
|
|
|
|
max_redemption_count: 53,
|
|
|
|
)
|
|
|
|
expect(user_invited_pending_page.latest_invite).to have_group(group)
|
|
|
|
expect(user_invited_pending_page.latest_invite).to have_topic(topic)
|
|
|
|
expect(user_invited_pending_page.latest_invite.expiry_date).to be_within(2.minutes).of(
|
|
|
|
Time.zone.now + 90.days,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
it "is possible to create an email invite and send email to the invited address" do
|
|
|
|
Jobs.run_immediately!
|
2024-10-21 18:11:43 +08:00
|
|
|
another_group = Fabricate(:group)
|
|
|
|
user.update!(admin: true)
|
|
|
|
page.refresh
|
|
|
|
open_invite_modal
|
|
|
|
display_advanced_options
|
|
|
|
|
|
|
|
create_invite_modal.form.field("restrictTo").fill_in("someone@discourse.org")
|
|
|
|
create_invite_modal.form.field("expiresAfterDays").select(1)
|
|
|
|
|
|
|
|
create_invite_modal.choose_topic(topic)
|
|
|
|
create_invite_modal.choose_groups([group, another_group])
|
|
|
|
|
|
|
|
create_invite_modal
|
|
|
|
.form
|
|
|
|
.field("customMessage")
|
|
|
|
.fill_in("Hello someone, this is a test invite")
|
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
create_invite_modal.save_and_email_button.click
|
2024-10-21 18:11:43 +08:00
|
|
|
|
|
|
|
expect(create_invite_modal).to have_copy_button
|
2024-11-08 12:59:24 +08:00
|
|
|
expect(create_invite_modal).to have_alert_message(
|
|
|
|
I18n.t("js.user.invited.invite.invite_saved_with_sending_email"),
|
|
|
|
)
|
2024-10-21 18:11:43 +08:00
|
|
|
|
|
|
|
invite_link = create_invite_modal.invite_link_input.value
|
|
|
|
|
|
|
|
create_invite_modal.close
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.invites_list.size).to eq(1)
|
|
|
|
|
|
|
|
expect(user_invited_pending_page.latest_invite).to be_email_type("someone@discourse.org")
|
|
|
|
expect(user_invited_pending_page.latest_invite).to have_group(group)
|
|
|
|
expect(user_invited_pending_page.latest_invite).to have_group(another_group)
|
|
|
|
expect(user_invited_pending_page.latest_invite).to have_topic(topic)
|
|
|
|
expect(user_invited_pending_page.latest_invite.expiry_date).to be_within(2.minutes).of(
|
|
|
|
Time.zone.now + 1.day,
|
|
|
|
)
|
2024-11-08 12:59:24 +08:00
|
|
|
sent_email = ActionMailer::Base.deliveries.first
|
|
|
|
expect(sent_email.to).to contain_exactly("someone@discourse.org")
|
|
|
|
expect(sent_email.parts[0].body.raw_source).to include(invite_link)
|
2024-10-21 18:11:43 +08:00
|
|
|
end
|
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
it "is possible to create an email invite without sending an email to the invited address" do
|
|
|
|
Jobs.run_immediately!
|
|
|
|
create_invite_modal.form.field("restrictTo").fill_in("invitedperson@email.org")
|
|
|
|
create_invite_modal.save_button.click
|
2024-10-21 18:11:43 +08:00
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
expect(create_invite_modal).to have_copy_button
|
|
|
|
expect(create_invite_modal).to have_alert_message(
|
|
|
|
I18n.t("js.user.invited.invite.invite_saved_without_sending_email"),
|
|
|
|
)
|
2024-10-21 18:11:43 +08:00
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
invite_link = create_invite_modal.invite_link_input.value
|
2024-10-21 18:11:43 +08:00
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
create_invite_modal.close
|
2024-10-21 18:11:43 +08:00
|
|
|
|
2024-11-08 12:59:24 +08:00
|
|
|
expect(user_invited_pending_page.invites_list.size).to eq(1)
|
|
|
|
expect(user_invited_pending_page.latest_invite).to be_email_type("invitedperson@email.org")
|
|
|
|
expect(ActionMailer::Base.deliveries).to eq([])
|
2024-10-21 18:11:43 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
it "shows the inviteToGroups field for a normal user if they're owner on at least 1 group" do
|
|
|
|
expect(create_invite_modal.form).to have_no_field_with_name("inviteToGroups")
|
|
|
|
|
|
|
|
group.add_owner(user)
|
|
|
|
page.refresh
|
|
|
|
open_invite_modal
|
|
|
|
display_advanced_options
|
|
|
|
|
|
|
|
expect(create_invite_modal.form).to have_field_with_name("inviteToGroups")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "shows the inviteToGroups field for admins" do
|
|
|
|
user.update!(admin: true)
|
|
|
|
page.refresh
|
|
|
|
open_invite_modal
|
|
|
|
display_advanced_options
|
|
|
|
|
|
|
|
expect(create_invite_modal.form).to have_field_with_name("inviteToGroups")
|
|
|
|
end
|
|
|
|
|
|
|
|
it "replaces the expiresAfterDays field with expiresAt with date and time controls after creating the invite" do
|
|
|
|
create_invite_modal.form.field("expiresAfterDays").select(1)
|
|
|
|
create_invite_modal.save_button.click
|
|
|
|
now = Time.zone.now
|
|
|
|
|
|
|
|
expect(create_invite_modal.form).to have_no_field_with_name("expiresAfterDays")
|
|
|
|
expect(create_invite_modal.form).to have_field_with_name("expiresAt")
|
|
|
|
|
|
|
|
expires_at_field = create_invite_modal.form.field("expiresAt").component
|
|
|
|
date = expires_at_field.find(".date-picker").value
|
|
|
|
time = expires_at_field.find(".time-input").value
|
|
|
|
|
|
|
|
expire_date = Time.parse("#{date} #{time}:#{now.strftime("%S")}").utc
|
|
|
|
expect(expire_date).to be_within_one_minute_of(now + 1.day)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|