🇺🇸 Upgrade to a supported web browser. Splat requires a modern web browser. Please use one of the browsers listed below and make sure auto-updates are enabled.
+
🇪🇸 Actualiza a un navegador web compatible. Splat requiere un navegador web moderno. Utiliza uno de los navegadores listados a continuación y asegúrate de que las actualizaciones automáticas estén habilitadas.
+
🇫🇷 Mettez à jour vers un navigateur web pris en charge. Splat nécessite un navigateur web moderne. Veuillez utiliser l'un des navigateurs répertoriés ci-dessous et assurez-vous que les mises à jour automatiques sont activées.
+
🇮🇳 समर्थित वेब ब्राउज़र में अपग्रेड करें। Splat को एक आधुनिक वेब ब्राउज़र की आवश्यकता है। कृपया नीचे सूचीबद्ध ब्राउज़रों में से कोई एक का उपयोग करें और सुनिश्चित करें कि स्वचालित अपडेट्स सक्षम हैं।
+
🇩🇪 Aktualisieren Sie auf einen unterstützten Webbrowser. Splat erfordert einen modernen Webbrowser. Verwenden Sie bitte einen der unten aufgeführten Browser und stellen Sie sicher, dass automatische Updates aktiviert sind.
+
🇧🇷 Atualize para um navegador compatível. O Splat requer um navegador moderno. Por favor, use um dos navegadores listados abaixo e certifique-se de que as atualizações automáticas estão ativadas.
+
Safari 17.2+, Chrome 119+, Firefox 121+, Opera 104+
+
+
+
+
diff --git a/test/controllers/sessions_controller_test.rb b/test/controllers/sessions_controller_test.rb
new file mode 100644
index 000000000..ab9bc8603
--- /dev/null
+++ b/test/controllers/sessions_controller_test.rb
@@ -0,0 +1,44 @@
+require "test_helper"
+
+class SessionsControllerTest < ActionDispatch::IntegrationTest
+ ALLOWED_BROWSER = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15"
+ DISALLOWED_BROWSER = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0"
+
+ test "new" do
+ get new_session_url
+ assert_response :success
+ end
+
+ test "new denied with incompatible browser" do
+ get new_session_url, env: { "HTTP_USER_AGENT" => DISALLOWED_BROWSER }
+ assert_select "svg", message: /Your browser is not supported/
+ end
+
+ test "new allowed with compatible browser" do
+ get new_session_url, env: { "HTTP_USER_AGENT" => ALLOWED_BROWSER }
+ assert_select "svg", message: /Your browser is not supported/, count: 0
+ end
+
+ test "create with valid credentials" do
+ post session_url, params: { user: { email_address: "david@37signals.com", password: "secret123456" } }
+
+ assert_redirected_to root_url
+ assert parsed_cookies.signed[:session_token]
+ end
+
+ test "create with invalid credentials" do
+ post session_url, params: { user: { email_address: "david@37signals.com", password: "wrong" } }
+
+ assert_response :unauthorized
+ assert_nil parsed_cookies.signed[:session_token]
+ end
+
+ test "destroy" do
+ sign_in :kevin
+
+ delete session_url
+
+ assert_redirected_to root_url
+ assert_not cookies[:session_token].present?
+ end
+end
diff --git a/test/fixtures/organizations.yml b/test/fixtures/organizations.yml
new file mode 100644
index 000000000..a3486ab04
--- /dev/null
+++ b/test/fixtures/organizations.yml
@@ -0,0 +1,2 @@
+37signals:
+ name: 37signals
diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml
new file mode 100644
index 000000000..6003e3a41
--- /dev/null
+++ b/test/fixtures/users.yml
@@ -0,0 +1,19 @@
+<% digest = BCrypt::Password.create("secret123456") %>
+
+david:
+ organization: 37signals
+ name: David
+ email_address: david@37signals.com
+ password_digest: <%= digest %>
+
+jz:
+ organization: 37signals
+ name: JZ
+ email_address: jz@37signals.com
+ password_digest: <%= digest %>
+
+kevin:
+ organization: 37signals
+ name: Kevin
+ email_address: kevin@37signals.com
+ password_digest: <%= digest %>
diff --git a/test/models/organization_test.rb b/test/models/organization_test.rb
new file mode 100644
index 000000000..3f86f1cd4
--- /dev/null
+++ b/test/models/organization_test.rb
@@ -0,0 +1,7 @@
+require "test_helper"
+
+class OrganizationTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/models/user_test.rb b/test/models/user_test.rb
new file mode 100644
index 000000000..5c07f4900
--- /dev/null
+++ b/test/models/user_test.rb
@@ -0,0 +1,7 @@
+require "test_helper"
+
+class UserTest < ActiveSupport::TestCase
+ # test "the truth" do
+ # assert true
+ # end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 0c22470ec..37e5e0a22 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -10,6 +10,6 @@ module ActiveSupport
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
- # Add more helper methods to be used by all tests here...
+ include SessionTestHelper
end
end
diff --git a/test/test_helpers/session_test_helper.rb b/test/test_helpers/session_test_helper.rb
new file mode 100644
index 000000000..53f04d420
--- /dev/null
+++ b/test/test_helpers/session_test_helper.rb
@@ -0,0 +1,16 @@
+module SessionTestHelper
+ def parsed_cookies
+ ActionDispatch::Cookies::CookieJar.build(request, cookies.to_hash)
+ end
+
+ def sign_in(user)
+ user = users(user) unless user.is_a? User
+ post session_url, params: { user: { email_address: user.email_address, password: "secret123456" } }
+ assert cookies[:session_token].present?
+ end
+
+ def sign_out
+ delete session_url
+ assert_not cookies[:session_token].present?
+ end
+end