diff options
Diffstat (limited to 'spec/support')
-rw-r--r-- | spec/support/.keep | 0 | ||||
-rw-r--r-- | spec/support/api_client.cr | 12 | ||||
-rw-r--r-- | spec/support/factories/.keep | 0 | ||||
-rw-r--r-- | spec/support/factories/user_factory.cr | 6 | ||||
-rw-r--r-- | spec/support/flows/authentication_flow.cr | 45 | ||||
-rw-r--r-- | spec/support/flows/base_flow.cr | 3 | ||||
-rw-r--r-- | spec/support/flows/reset_password_flow.cr | 42 |
7 files changed, 108 insertions, 0 deletions
diff --git a/spec/support/.keep b/spec/support/.keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/spec/support/.keep diff --git a/spec/support/api_client.cr b/spec/support/api_client.cr new file mode 100644 index 0000000..46d449a --- /dev/null +++ b/spec/support/api_client.cr @@ -0,0 +1,12 @@ +class ApiClient < Lucky::BaseHTTPClient + app AppServer.new + + def initialize + super + headers("Content-Type": "application/json") + end + + def self.auth(user : User) + new.headers("Authorization": UserToken.generate(user)) + end +end diff --git a/spec/support/factories/.keep b/spec/support/factories/.keep new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/spec/support/factories/.keep diff --git a/spec/support/factories/user_factory.cr b/spec/support/factories/user_factory.cr new file mode 100644 index 0000000..bb837ee --- /dev/null +++ b/spec/support/factories/user_factory.cr @@ -0,0 +1,6 @@ +class UserFactory < Avram::Factory + def initialize + email "#{sequence("test-email")}@example.com" + encrypted_password Authentic.generate_encrypted_password("password") + end +end diff --git a/spec/support/flows/authentication_flow.cr b/spec/support/flows/authentication_flow.cr new file mode 100644 index 0000000..183697f --- /dev/null +++ b/spec/support/flows/authentication_flow.cr @@ -0,0 +1,45 @@ +class AuthenticationFlow < BaseFlow + private getter email + + def initialize(@email : String) + end + + def sign_up(password) + visit SignUps::New + fill_form SignUpUser, + email: email, + password: password, + password_confirmation: password + click "@sign-up-button" + end + + def sign_out + visit Me::Show + sign_out_button.click + end + + def sign_in(password) + visit SignIns::New + fill_form SignInUser, + email: email, + password: password + click "@sign-in-button" + end + + def should_be_signed_in + current_page.should have_element("@sign-out-button") + end + + def should_have_password_error + current_page.should have_element("body", text: "Password is wrong") + end + + private def sign_out_button + el("@sign-out-button") + end + + # NOTE: this is a shim for readability + private def current_page + self + end +end diff --git a/spec/support/flows/base_flow.cr b/spec/support/flows/base_flow.cr new file mode 100644 index 0000000..93709b2 --- /dev/null +++ b/spec/support/flows/base_flow.cr @@ -0,0 +1,3 @@ +# Add methods that all or most Flows need to share +class BaseFlow < LuckyFlow +end diff --git a/spec/support/flows/reset_password_flow.cr b/spec/support/flows/reset_password_flow.cr new file mode 100644 index 0000000..b1df710 --- /dev/null +++ b/spec/support/flows/reset_password_flow.cr @@ -0,0 +1,42 @@ +class ResetPasswordFlow < BaseFlow + private getter user, authentication_flow + delegate sign_in, sign_out, should_have_password_error, should_be_signed_in, + to: authentication_flow + delegate email, to: user + + def initialize(@user : User) + @authentication_flow = AuthenticationFlow.new(user.email) + end + + def request_password_reset + with_fake_token do + visit PasswordResetRequests::New + fill_form RequestPasswordReset, + email: email + click "@request-password-reset-button" + end + end + + def should_have_sent_reset_email + with_fake_token do + user = UserQuery.new.email(email).first + PasswordResetRequestEmail.new(user).should be_delivered + end + end + + def reset_password(password) + user = UserQuery.new.email(email).first + token = Authentic.generate_password_reset_token(user) + visit PasswordResets::New.with(user.id, token) + fill_form ResetPassword, + password: password, + password_confirmation: password + click "@update-password-button" + end + + private def with_fake_token(&) + PasswordResetRequestEmail.temp_config(stubbed_token: "fake") do + yield + end + end +end |