* Add feature test that tests behaviour of profile name and bio * Fix rubocop style errors in Login Spec. * DRY log_in_spec by reusing the stories helper Co-authored-by: Eugen Rochko <eugen@zeonfederated.com>master
@ -1,47 +1,51 @@ | |||||
require "rails_helper" | |||||
# frozen_string_literal: true | |||||
require 'rails_helper' | |||||
feature 'Log in' do | |||||
include ProfileStories | |||||
feature "Log in" do | |||||
given(:email) { "test@example.com" } | given(:email) { "test@example.com" } | ||||
given(:password) { "password" } | given(:password) { "password" } | ||||
given(:confirmed_at) { Time.zone.now } | given(:confirmed_at) { Time.zone.now } | ||||
background do | background do | ||||
Fabricate(:user, email: email, password: password, confirmed_at: confirmed_at) | |||||
as_a_registered_user | |||||
visit new_user_session_path | visit new_user_session_path | ||||
end | end | ||||
subject { page } | subject { page } | ||||
scenario "A valid email and password user is able to log in"; do | |||||
fill_in "user_email";, with: email | |||||
fill_in "user_password";, with: password | |||||
scenario 'A valid email and password user is able to log in'; do | |||||
fill_in 'user_email';, with: email | |||||
fill_in 'user_password';, with: password | |||||
click_on I18n.t('auth.login') | click_on I18n.t('auth.login') | ||||
is_expected.to have_css("div.app-holder";) | |||||
is_expected.to have_css('div.app-holder';) | |||||
end | end | ||||
scenario "A invalid email and password user is not able to log in"; do | |||||
fill_in "user_email";, with: "invalid_email"; | |||||
fill_in "user_password";, with: "invalid_password"; | |||||
scenario 'A invalid email and password user is not able to log in'; do | |||||
fill_in 'user_email';, with: 'invalid_email'; | |||||
fill_in 'user_password';, with: 'invalid_password'; | |||||
click_on I18n.t('auth.login') | click_on I18n.t('auth.login') | ||||
is_expected.to have_css(".flash-message";, text: failure_message("invalid";)) | |||||
is_expected.to have_css('.flash-message';, text: failure_message('invalid';)) | |||||
end | end | ||||
context do | context do | ||||
given(:confirmed_at) { nil } | given(:confirmed_at) { nil } | ||||
scenario "A unconfirmed user is able to log in"; do | |||||
fill_in "user_email";, with: email | |||||
fill_in "user_password";, with: password | |||||
scenario 'A unconfirmed user is able to log in'; do | |||||
fill_in 'user_email';, with: email | |||||
fill_in 'user_password';, with: password | |||||
click_on I18n.t('auth.login') | click_on I18n.t('auth.login') | ||||
is_expected.to have_css("div.admin-wrapper";) | |||||
is_expected.to have_css('div.admin-wrapper';) | |||||
end | end | ||||
end | end | ||||
def failure_message(message) | def failure_message(message) | ||||
keys = User.authentication_keys.map { |key| User.human_attribute_name(key) } | keys = User.authentication_keys.map { |key| User.human_attribute_name(key) } | ||||
I18n.t("devise.failure.#{message}", authentication_keys: keys.join("support.array.words_connector";)) | |||||
I18n.t("devise.failure.#{message}", authentication_keys: keys.join('support.array.words_connector';)) | |||||
end | end | ||||
end | end |
@ -0,0 +1,53 @@ | |||||
# frozen_string_literal: true | |||||
require 'rails_helper' | |||||
feature 'Profile' do | |||||
include ProfileStories | |||||
given(:local_domain) { ENV['LOCAL_DOMAIN'] } | |||||
background do | |||||
as_a_logged_in_user | |||||
with_alice_as_local_user | |||||
end | |||||
subject { page } | |||||
scenario 'I can view Annes public account' do | |||||
visit account_path('alice') | |||||
is_expected.to have_title("alice (@alice@#{local_domain})") | |||||
within('.public-account-header h1') do | |||||
is_expected.to have_content("alice @alice@#{local_domain}") | |||||
end | |||||
bio_elem = first('.public-account-bio') | |||||
expect(bio_elem).to have_content(alice_bio) | |||||
# The bio has hashtags made clickable | |||||
expect(bio_elem).to have_link('cryptology') | |||||
expect(bio_elem).to have_link('science') | |||||
# Nicknames are make clickable | |||||
expect(bio_elem).to have_link('@alice') | |||||
expect(bio_elem).to have_link('@bob') | |||||
# Nicknames not on server are not clickable | |||||
expect(bio_elem).not_to have_link('@pepe') | |||||
end | |||||
scenario 'I can change my account' do | |||||
visit settings_profile_path | |||||
fill_in 'Display name', with: 'Bob' | |||||
fill_in 'Bio', with: 'Bob is silent' | |||||
click_on 'Save changes' | |||||
is_expected.to have_content 'Changes successfully saved!' | |||||
# View my own public profile and see the changes | |||||
click_link "Bob @bob@#{local_domain}" | |||||
within('.public-account-header h1') do | |||||
is_expected.to have_content("Bob @bob@#{local_domain}") | |||||
end | |||||
expect(first('.public-account-bio')).to have_content('Bob is silent') | |||||
end | |||||
end |
@ -0,0 +1,45 @@ | |||||
# frozen_string_literal: true | |||||
module ProfileStories | |||||
attr_reader :bob, :alice, :alice_bio | |||||
def as_a_registered_user | |||||
@bob = Fabricate( | |||||
:user, | |||||
email: email, password: password, confirmed_at: confirmed_at, | |||||
account: Fabricate(:account, username: 'bob') | |||||
) | |||||
end | |||||
def as_a_logged_in_user | |||||
as_a_registered_user | |||||
visit new_user_session_path | |||||
fill_in 'user_email', with: email | |||||
fill_in 'user_password', with: password | |||||
click_on I18n.t('auth.login') | |||||
end | |||||
def with_alice_as_local_user | |||||
@alice_bio = '@alice and @bob are fictional characters commonly used as'\ | |||||
'placeholder names in #cryptology, as well as #science and'\ | |||||
'engineering 📖 literature. Not affilated with @pepe.' | |||||
@alice = Fabricate( | |||||
:user, | |||||
email: 'alice@example.com', password: password, confirmed_at: confirmed_at, | |||||
account: Fabricate(:account, username: 'alice', note: @alice_bio) | |||||
) | |||||
end | |||||
def confirmed_at | |||||
@confirmed_at ||= Time.zone.now | |||||
end | |||||
def email | |||||
@email ||= 'test@example.com' | |||||
end | |||||
def password | |||||
@password ||= 'password' | |||||
end | |||||
end |