docbrown/spec/requests/onboardings_spec.rb
Duke Greene cf7847fadb
remove onboarding background image, use gradient based on brand color (#19815)
* remove background image, rename prop to refer to color, pass primary brand color

* create helper method, send calculated gradient values into frontend props

* test new helper method and refine how color is darkened
2023-07-27 07:27:21 -04:00

311 lines
10 KiB
Ruby

require "rails_helper"
RSpec.describe "Onboardings" do
let(:user) do
create(:user,
saw_onboarding: false,
_skip_creating_profile: true,
profile: create(:profile, location: "Llama Town"))
end
describe "GET /onboarding" do
it "redirects user if unauthenticated" do
get onboarding_url
expect(response).to redirect_to("/enter")
end
it "return 200 when authenticated" do
sign_in user
get onboarding_url
expect(response).to have_http_status(:ok)
end
it "contains proper data attribute keys" do
sign_in user
get onboarding_url
expect(response.body).to include("data-community-description")
expect(response.body).to include("data-community-logo")
expect(response.body).to include("data-community-background-color")
expect(response.body).to include("data-community-name")
end
it "contains proper data attribute values if the onboarding config is present" do
sign_in user
get onboarding_url
expect(response.body).to include(Settings::Community.community_description)
end
end
describe "GET /users_and_organizations" do
context "when no suggestions are found" do
it "returns an empty array (no automated suggested follow)" do
sign_in user
get users_and_organizations_onboarding_path
expect(response).to have_http_status(:ok)
expect(response.parsed_body).to eq([])
end
end
context "when only user suggestions are found" do
let(:tag) { create(:tag) }
let(:other_user) { create(:user) }
# Prepare auto-generated user suggestions
before do
user.follow(tag)
create(:article, user: other_user, tags: [tag.name])
end
it "returns follow suggestions for an authenticated user" do
sign_in user
get users_and_organizations_onboarding_path
response_user = response.parsed_body.first
expect(response_user["id"]).to eq(other_user.id)
end
it "returns follow suggestions that have profile images" do
sign_in user
get users_and_organizations_onboarding_path
response_user = response.parsed_body.first
expect(response_user["profile_image_url"]).to eq(other_user.profile_image_url)
end
end
context "when organization suggestions are found" do
let(:suggested_orgs) { create_list(:organization, 2) }
let(:expected_json_keys) do
%w[id name username profile_image_url following summary type_identifier]
end
before do
allow(FeatureFlag).to receive(:enabled?).and_return(true)
allow(Organizations::SuggestProminent).to receive(:call).and_return(suggested_orgs)
end
it "returns organization follow suggestions for an authenticated user" do
sign_in user
get users_and_organizations_onboarding_path
response_org_ids = response.parsed_body.pluck("id")
expect(response_org_ids.size).to eq(2)
suggested_org_ids = suggested_orgs.map(&:id)
expect(response_org_ids).to match_array(suggested_org_ids)
end
it "returns organization follow suggestions that have profile images" do
sign_in user
get users_and_organizations_onboarding_path
response_org = response.parsed_body.first
expect(response_org.keys).to match_array(expected_json_keys)
expect(response_org["profile_image_url"]).to eq(suggested_orgs.first.profile_image_url)
end
end
context "when organization and user suggestions are found" do
let(:suggested_users) { create_list(:user, 2) }
let(:suggested_orgs) { create_list(:organization, 2) }
let(:expected_json_keys) do
%w[id name username profile_image_url following summary type_identifier]
end
before do
allow(FeatureFlag).to receive(:enabled?).and_return(true)
allow(Organizations::SuggestProminent).to receive(:call).and_return(suggested_orgs)
allow(Users::SuggestProminent).to receive(:call).and_return(suggested_users)
end
it "returns users first, then organizations" do
sign_in user
get users_and_organizations_onboarding_path
response_ids = response.parsed_body.pluck("id")
expect(response_ids.size).to eq(4)
suggested_ids = suggested_users.map(&:id) + suggested_orgs.map(&:id)
expect(response_ids).to eq(suggested_ids)
end
end
end
describe "GET /onboarding/tags" do
let(:headers) do
{
Accept: "application/json",
"Content-Type": "application/json"
}
end
before do
sign_in user
allow(Settings::General).to receive(:suggested_tags).and_return(%w[beginners javascript career])
end
it "returns tags" do
create(:tag, name: Settings::General.suggested_tags.first)
get tags_onboarding_path, headers: headers
expect(response.parsed_body.size).to eq(1)
end
it "returns tags with the correct json representation" do
tag = create(:tag, name: Settings::General.suggested_tags.first)
get tags_onboarding_path, headers: headers
response_tag = response.parsed_body.first
expect(response_tag.keys).to \
match_array(OnboardingsController::TAG_ONBOARDING_ATTRIBUTES.map(&:to_s))
expect(response_tag["id"]).to eq(tag.id)
expect(response_tag["name"]).to eq(tag.name)
expect(response_tag["taggings_count"]).to eq(tag.taggings_count)
end
it "returns suggested and supported tags" do
not_suggested_but_supported = create(:tag, name: "notsuggestedbutsupported", supported: true, suggested: false)
neither_suggested_nor_supported = create(:tag, name: "definitelynotasuggestedtag", supported: false)
get tags_onboarding_path, headers: headers
expect(response.parsed_body.filter { |t| t["name"] == not_suggested_but_supported.name }).not_to be_empty
expect(response.parsed_body.filter { |t| t["name"] == neither_suggested_nor_supported.name }).to be_empty
end
it "sets the correct edge caching surrogate key for all tags" do
tag = create(:tag, name: Settings::General.suggested_tags.first)
get tags_onboarding_path, headers: headers
expected_key = ["tags", tag.record_key].to_set
expect(response.headers["surrogate-key"].split.to_set).to eq(expected_key)
end
end
describe "PATCH /onboarding" do
context "when signed in" do
before { sign_in user }
it "updates the user's last_onboarding_page attribute" do
params = { user: { last_onboarding_page: "v2: personal info form", username: "test" } }
expect do
patch "/onboarding", params: params
end.to change(user, :last_onboarding_page)
end
it "updates the user's username attribute" do
params = { user: { username: "WilhuffTarkin" } }
expect do
patch "/onboarding", params: params
end.to change(user, :username).to("wilhufftarkin")
end
it "returns a 422 error if the username is blank" do
params = { user: { username: "" } }
patch "/onboarding", params: params
expect(response).to have_http_status(:unprocessable_entity)
end
it "updates the user's profile" do
params = { profile: { location: "Galactic Empire" } }
expect do
patch "/onboarding", params: params
end.to change(user.profile, :location).to("Galactic Empire")
end
it "does not update the user's last_onboarding_page if it is empty" do
params = { user: { last_onboarding_page: "" } }
expect do
patch "/onboarding", params: params
end.not_to change(user, :last_onboarding_page)
end
end
context "when signed out" do
it "returns a not found error if user is not signed in" do
patch "/onboarding.json", params: {}
expect(response.parsed_body["error"]).to include("Please sign in")
end
end
end
describe "PATCH /onboarding/checkbox" do
context "when signed in" do
before { sign_in user }
it "updates saw_onboarding boolean" do
patch "/onboarding/checkbox.json", params: {}
expect(user.saw_onboarding).to be(true)
end
it "updates checked_code_of_conduct and checked_terms_and_conditions" do
patch "/onboarding/checkbox.json",
params: {
checked_code_of_conduct: "1",
checked_terms_and_conditions: "1"
}
expect(user.checked_code_of_conduct).to be(true)
expect(user.checked_terms_and_conditions).to be(true)
end
end
context "when signed out" do
it "returns a not found error if user is not signed in" do
patch "/onboarding/checkbox.json", params: {}
expect(response.parsed_body["error"]).to include("Please sign in")
end
end
end
describe "PATCH /onboarding/notifications" do
before { sign_in user }
it "updates onboarding checkbox" do
user.update_column(:saw_onboarding, false)
expect do
patch notifications_onboarding_path(format: :json),
params: { notifications: { tab: "notifications", email_newsletter: 1 } }
end.to change { user.notification_setting.reload.email_newsletter }.from(false).to(true)
expect(user.saw_onboarding).to be(true)
end
it "can toggle email_newsletter" do
expect do
patch notifications_onboarding_path(format: :json),
params: { notifications: { tab: "notifications", email_newsletter: 1 } }
end.to change { user.notification_setting.reload.email_newsletter }.from(false).to(true)
expect do
patch notifications_onboarding_path(format: :json),
params: { notifications: { tab: "notifications", email_newsletter: 0 } }
end.to change { user.notification_setting.reload.email_newsletter }.from(true).to(false)
end
it "can toggle email_digest_periodic" do
expect do
patch notifications_onboarding_path(format: :json),
params: { notifications: { tab: "notifications", email_digest_periodic: 1 } }
end.to change { user.notification_setting.reload.email_digest_periodic }.from(false).to(true)
expect do
patch notifications_onboarding_path(format: :json),
params: { notifications: { tab: "notifications", email_digest_periodic: 0 } }
end.to change { user.notification_setting.reload.email_digest_periodic }.from(true).to(false)
end
end
end