aboutsummaryrefslogtreecommitdiff
path: root/spec/support
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support')
-rw-r--r--spec/support/.keep0
-rw-r--r--spec/support/api_client.cr12
-rw-r--r--spec/support/factories/.keep0
-rw-r--r--spec/support/factories/user_factory.cr6
-rw-r--r--spec/support/flows/authentication_flow.cr45
-rw-r--r--spec/support/flows/base_flow.cr3
-rw-r--r--spec/support/flows/reset_password_flow.cr42
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