Fix mobile login "Record not found" for unseeded instances (#916)

* Auto-create mobile OAuth application when missing (#912)

Self-hosted users who set up their instance without running `db:seed`
(or reset their database) got "Record not found" on mobile login because
`MobileDevice.shared_oauth_application` used `find_by!` which raises
when the "Sure Mobile" Doorkeeper application does not exist.

Switch to `find_or_create_by!` so the record is created transparently
on first use, matching the attributes from the seed file.

* Nice Claude Code suggestion

---------

Co-authored-by: Juan José Mata <jjmata@jjmata.com>
This commit is contained in:
Dream
2026-02-06 12:04:29 -05:00
committed by GitHub
parent ba6e286b41
commit 6779951194
3 changed files with 50 additions and 4 deletions

View File

@@ -342,6 +342,28 @@ class Api::V1::AuthControllerTest < ActionDispatch::IntegrationTest
assert_equal "Invalid email or password", response_data["error"]
end
test "should login even when OAuth application is missing" do
user = users(:family_admin)
password = user_password_test
# Simulate a fresh instance where seeds were never run
Doorkeeper::Application.where(name: "Sure Mobile").destroy_all
MobileDevice.instance_variable_set(:@shared_oauth_application, nil)
assert_difference("Doorkeeper::Application.count", 1) do
post "/api/v1/auth/login", params: {
email: user.email,
password: password,
device: @device_info
}
end
assert_response :success
response_data = JSON.parse(response.body)
assert response_data["access_token"].present?
assert response_data["refresh_token"].present?
end
test "should not login without device info" do
user = users(:family_admin)