hackatime/test/controllers/settings_goals_controller_test.rb
Mahad Kalam 44777ad644
Data export fix + async exports + more tests (#989)
* Fix data export + Capybara

* Continue?

* A ton of system tests :D + test cleanup

* More system tests

* Add placeholder keys for tests?

* Get rid of the double-query!

* Speed up CI Chrome setup by avoiding snap installs

* Pin CI Chrome version to reduce system test flakiness

* Stabilize integrations settings system test interaction
2026-02-21 11:28:21 +00:00

177 lines
4.1 KiB
Ruby

require "test_helper"
class SettingsGoalsControllerTest < ActionDispatch::IntegrationTest
fixtures :users
test "show renders goals settings page" do
user = users(:one)
sign_in_as(user)
get my_settings_goals_path
assert_response :success
assert_inertia_component "Users/Settings/Goals"
page = inertia_page
assert_equal my_settings_goals_path, page.dig("props", "section_paths", "goals")
assert_equal [], page.dig("props", "user", "programming_goals")
end
test "create saves valid goal" do
user = users(:one)
sign_in_as(user)
post my_settings_goals_create_path, params: {
goal: {
period: "day",
target_seconds: 3600,
languages: [ "Ruby" ],
projects: [ "hackatime" ]
}
}
assert_response :redirect
assert_redirected_to my_settings_goals_path
saved_goal = user.reload.goals.first
assert_equal "day", saved_goal.period
assert_equal [ "Ruby" ], saved_goal.languages
assert_equal [ "hackatime" ], saved_goal.projects
end
test "rejects sixth goal when limit reached" do
user = users(:one)
sign_in_as(user)
5.times do |index|
user.goals.create!(
period: "day",
target_seconds: 1800 + index,
languages: [],
projects: []
)
end
post my_settings_goals_create_path, params: {
goal: {
period: "day",
target_seconds: 9999,
languages: [],
projects: []
}
}
assert_response :unprocessable_entity
assert_equal 5, user.reload.goals.count
end
test "create rejects invalid goal period" do
user = users(:one)
sign_in_as(user)
post my_settings_goals_create_path, params: {
goal: {
period: "year",
target_seconds: 1800,
languages: [],
projects: []
}
}
assert_response :unprocessable_entity
assert_equal 0, user.reload.goals.count
end
test "create rejects nonpositive goal target" do
user = users(:one)
sign_in_as(user)
post my_settings_goals_create_path, params: {
goal: {
period: "day",
target_seconds: 0,
languages: [],
projects: []
}
}
assert_response :unprocessable_entity
assert_equal 0, user.reload.goals.count
end
test "create rejects impossible day target" do
user = users(:one)
sign_in_as(user)
post my_settings_goals_create_path, params: {
goal: {
period: "day",
target_seconds: 25.hours.to_i,
languages: [],
projects: []
}
}
assert_response :unprocessable_entity
assert_equal 0, user.reload.goals.count
end
test "update saves valid goal changes" do
user = users(:one)
goal = user.goals.create!(
period: "day",
target_seconds: 1800,
languages: [ "Ruby" ],
projects: [ "alpha" ]
)
sign_in_as(user)
patch my_settings_goal_update_path(goal_id: goal.id), params: {
goal: {
period: "week",
target_seconds: 7200,
languages: [ "Python" ],
projects: [ "beta" ]
}
}
assert_response :redirect
assert_redirected_to my_settings_goals_path
goal.reload
assert_equal "week", goal.period
assert_equal 7200, goal.target_seconds
assert_equal [ "Python" ], goal.languages
assert_equal [ "beta" ], goal.projects
end
test "update rejects invalid goal and re-renders settings page" do
user = users(:one)
goal = user.goals.create!(period: "day", target_seconds: 1800)
sign_in_as(user)
patch my_settings_goal_update_path(goal_id: goal.id), params: {
goal: {
period: "year",
target_seconds: 1800
}
}
assert_response :unprocessable_entity
assert_inertia_component "Users/Settings/Goals"
assert_equal "day", goal.reload.period
end
test "destroy removes goal" do
user = users(:one)
goal = user.goals.create!(period: "day", target_seconds: 1800)
sign_in_as(user)
assert_difference -> { user.reload.goals.count }, -1 do
delete my_settings_goal_destroy_path(goal_id: goal.id)
end
assert_response :redirect
assert_redirected_to my_settings_goals_path
end
end