Skip to content

Commit 49a1085

Browse files
committed
Add tests.
1 parent abc9526 commit 49a1085

File tree

7 files changed

+276
-1
lines changed

7 files changed

+276
-1
lines changed

Gemfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ group :development, :test do
2424
gem "dotenv", "~> 3.1", ">= 3.1.2"
2525
gem "factory_bot_rails", "~> 6.4", ">= 6.4.3"
2626
gem "faker", "~> 3.4"
27+
gem "mocha", "~> 1.2", ">= 1.2.1"
28+
gem "rails-controller-testing", "~> 0.0.3"
2729
gem "rubocop-rails-omakase", "~> 1.0", require: false, group: [:development]
2830
gem "minitest-reporters", "~> 1.6", ">= 1.6.1"
2931
end

Gemfile.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ GEM
172172
builder
173173
minitest (>= 5.0)
174174
ruby-progressbar
175+
mocha (1.16.1)
175176
msgpack (1.7.2)
176177
mutex_m (0.2.0)
177178
net-imap (0.4.13)
@@ -237,6 +238,8 @@ GEM
237238
activesupport (= 7.1.3.4)
238239
bundler (>= 1.15.0)
239240
railties (= 7.1.3.4)
241+
rails-controller-testing (0.0.3)
242+
rails (>= 4.2)
240243
rails-dom-testing (2.2.0)
241244
activesupport (>= 5.0.0)
242245
minitest
@@ -364,10 +367,12 @@ DEPENDENCIES
364367
jbuilder (~> 2.12)
365368
letter_opener (~> 1.10)
366369
minitest-reporters (~> 1.6, >= 1.6.1)
370+
mocha (~> 1.2, >= 1.2.1)
367371
pg (~> 1.5, >= 1.5.6)
368372
phlex-rails (~> 1.2)
369373
puma (~> 6.4, >= 6.4.2)
370374
rails (~> 7.1, >= 7.1.3.4)
375+
rails-controller-testing (~> 0.0.3)
371376
rexml (>= 3.3.2)
372377
rubocop (~> 1.63, >= 1.63.5)
373378
rubocop-factory_bot (~> 2.25, >= 2.25.1)

app/models/job_application.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ class JobApplication < ApplicationRecord
44
validates :date_applied, :company_name, :method_of_contact, :position_type, :position_title, presence: true
55
validates :email_address, presence: true, if: -> { method_of_contact == "email" }
66
validates :point_of_contact, presence: true, if: -> { ["email", "phone", "recruiter", "other"].include?(method_of_contact) }
7-
validates :website_link, presence: true, if: -> { method_of_contact == "internet job application" }
7+
validates :website_link, presence: true, if: -> { method_of_contact == "internet_job_application" }
88
validates :website_link, url: {
99
allow_blank: true,
1010
schemes: ["http", "https"],
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
require "test_helper"
2+
3+
class JobApplicationsControllerTest < ActionDispatch::IntegrationTest
4+
setup do
5+
@job_application = create(:job_application)
6+
end
7+
8+
test "should get index" do
9+
get job_applications_url
10+
assert_response :success
11+
end
12+
13+
test "should get new" do
14+
get new_job_application_url
15+
assert_response :success
16+
end
17+
18+
test "should create job_application" do
19+
assert_difference("JobApplication.count") do
20+
post job_applications_url, params: {job_application: attributes_for(:job_application)}
21+
end
22+
23+
assert_redirected_to root_url
24+
end
25+
26+
test "should get edit" do
27+
get edit_job_application_url(@job_application)
28+
assert_response :success
29+
end
30+
31+
test "should update job_application" do
32+
patch job_application_url(@job_application), params: {job_application: {company_name: "Updated Company"}}
33+
assert_redirected_to root_url
34+
@job_application.reload
35+
assert_equal "Updated Company", @job_application.company_name
36+
end
37+
38+
test "should destroy job_application" do
39+
assert_difference("JobApplication.count", -1) do
40+
delete job_application_url(@job_application)
41+
end
42+
43+
assert_redirected_to root_url
44+
end
45+
46+
test "should filter job_applications" do
47+
create(:job_application_phone)
48+
create(:job_application, :with_website)
49+
create(:job_application, :hired)
50+
51+
get job_applications_url, params: {method_of_contact: "email"}
52+
assert_response :success
53+
assert_equal 1, @controller.view_assigns["job_applications"].count
54+
55+
get job_applications_url, params: {method_of_contact: "internet_job_application"}
56+
assert_response :success
57+
assert_equal 1, @controller.view_assigns["job_applications"].count
58+
59+
get job_applications_url, params: {status: "hired"}
60+
assert_response :success
61+
assert_equal 1, @controller.view_assigns["job_applications"].count
62+
end
63+
64+
test "should search job_applications" do
65+
create(:job_application_unique)
66+
67+
get job_applications_url, params: {search: "Unique"}
68+
assert_response :success
69+
assert_equal 1, @controller.view_assigns["job_applications"].count
70+
end
71+
72+
test "should sort job_applications" do
73+
create(:job_application_jan_2)
74+
create(:job_application_jan_1)
75+
76+
get job_applications_url, params: {sort: "date_applied", direction: "asc"}
77+
assert_response :success
78+
assert_equal Date.new(2023, 1, 1), @controller.view_assigns["job_applications"].first.date_applied
79+
80+
get job_applications_url, params: {sort: "date_applied", direction: "desc"}
81+
assert_response :success
82+
assert_equal Date.new(2023, 1, 2), @controller.view_assigns["job_applications"].first.date_applied
83+
end
84+
end
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
FactoryBot.define do
2+
factory :job_application do
3+
date_applied { Date.new(2023, 1, 1) }
4+
company_name { "Example Company" }
5+
method_of_contact { "email" }
6+
position_type { "full_time" }
7+
position_title { "Software Engineer" }
8+
claimed_for_unemployment { false }
9+
status { "interviewing" }
10+
email_address { "[email protected]" }
11+
point_of_contact { "John Doe" }
12+
13+
trait :with_website do
14+
method_of_contact { "internet_job_application" }
15+
website_link { "https://example.com/jobs" }
16+
end
17+
18+
trait :claimed do
19+
claimed_for_unemployment { true }
20+
end
21+
22+
trait :hired do
23+
status { "hired" }
24+
end
25+
26+
factory :job_application_phone do
27+
method_of_contact { "phone" }
28+
end
29+
30+
factory :job_application_unique do
31+
company_name { "Unique Company" }
32+
end
33+
34+
factory :job_application_jan_2 do
35+
date_applied { Date.new(2023, 1, 2) }
36+
end
37+
38+
factory :job_application_jan_1 do
39+
date_applied { Date.new(2023, 1, 1) }
40+
end
41+
end
42+
end
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
require "test_helper"
2+
3+
class JobApplicationTest < ActiveSupport::TestCase
4+
def setup
5+
@job_application = build(:job_application)
6+
end
7+
8+
test "valid job application" do
9+
assert @job_application.valid?
10+
end
11+
12+
test "invalid without date_applied" do
13+
@job_application.date_applied = nil
14+
assert_not @job_application.valid?
15+
assert_not_nil @job_application.errors[:date_applied]
16+
end
17+
18+
test "invalid without company_name" do
19+
@job_application.company_name = nil
20+
assert_not @job_application.valid?
21+
assert_not_nil @job_application.errors[:company_name]
22+
end
23+
24+
test "invalid without method_of_contact" do
25+
@job_application.method_of_contact = nil
26+
assert_not @job_application.valid?
27+
assert_not_nil @job_application.errors[:method_of_contact]
28+
end
29+
30+
test "invalid without position_type" do
31+
@job_application.position_type = nil
32+
assert_not @job_application.valid?
33+
assert_not_nil @job_application.errors[:position_type]
34+
end
35+
36+
test "invalid without position_title" do
37+
@job_application.position_title = nil
38+
assert_not @job_application.valid?
39+
assert_not_nil @job_application.errors[:position_title]
40+
end
41+
42+
test "requires email_address when method_of_contact is email" do
43+
@job_application.email_address = nil
44+
assert_not @job_application.valid?
45+
assert_not_nil @job_application.errors[:email_address]
46+
end
47+
48+
test "requires website_link when method_of_contact is internet job application" do
49+
@job_application = build(:job_application,
50+
method_of_contact: "internet_job_application",
51+
website_link: nil)
52+
53+
assert_not @job_application.valid?
54+
assert_includes @job_application.errors.full_messages, "Website link can't be blank"
55+
end
56+
57+
test "validates website_link format" do
58+
@job_application = build(:job_application, :with_website)
59+
@job_application.website_link = "invalid-url"
60+
assert_not @job_application.valid?
61+
assert_not_nil @job_application.errors[:website_link]
62+
end
63+
64+
test "validates status inclusion" do
65+
assert_raises(ArgumentError) do
66+
build(:job_application, status: "invalid_status")
67+
end
68+
end
69+
70+
test "search scope" do
71+
create(:job_application, company_name: "Unique Company")
72+
create(:job_application, position_title: "Unique Position")
73+
74+
assert_equal 1, JobApplication.search("Unique Company").count
75+
assert_equal 1, JobApplication.search("Unique Position").count
76+
assert_equal 2, JobApplication.search("Unique").count
77+
end
78+
79+
test "by_method_of_contact scope" do
80+
create(:job_application, method_of_contact: "email")
81+
create(:job_application, :with_website)
82+
83+
assert_equal 1, JobApplication.by_method_of_contact("email").count
84+
assert_equal 1, JobApplication.by_method_of_contact("internet_job_application").count
85+
end
86+
87+
test "by_position_type scope" do
88+
create(:job_application, position_type: "full_time")
89+
create(:job_application, position_type: "part_time")
90+
91+
assert_equal 1, JobApplication.by_position_type("full_time").count
92+
assert_equal 1, JobApplication.by_position_type("part_time").count
93+
end
94+
95+
test "by_status scope" do
96+
create(:job_application, status: "interviewing")
97+
create(:job_application, :hired)
98+
99+
assert_equal 1, JobApplication.by_status("interviewing").count
100+
assert_equal 1, JobApplication.by_status("hired").count
101+
end
102+
103+
test "claimed_for_unemployment scope" do
104+
create(:job_application, :claimed)
105+
create(:job_application)
106+
107+
assert_equal 1, JobApplication.claimed_for_unemployment.count
108+
end
109+
110+
test "not_claimed_for_unemployment scope" do
111+
create(:job_application, :claimed)
112+
create(:job_application)
113+
114+
assert_equal 1, JobApplication.not_claimed_for_unemployment.count
115+
end
116+
end

test/test_helper.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
require_relative "../config/environment"
33
require "rails/test_help"
44
require "minitest/reporters"
5+
require "factory_bot_rails"
6+
require "rails-controller-testing"
57

68
reporters = []
79

@@ -17,6 +19,29 @@
1719
end
1820
Minitest::Reporters.use! reporters
1921

22+
class ActionDispatch::IntegrationTest
23+
setup do
24+
# Mock Vite helpers
25+
ActionView::Base.class_eval do
26+
def vite_javascript_tag(*args)
27+
""
28+
end
29+
30+
def vite_client_tag
31+
""
32+
end
33+
34+
def vite_stylesheet_tag(*args)
35+
""
36+
end
37+
38+
def vite_asset_path(*args)
39+
""
40+
end
41+
end
42+
end
43+
end
44+
2045
module ActiveSupport
2146
class TestCase
2247
# Run tests in parallel with specified workers
@@ -26,6 +51,7 @@ class TestCase
2651
fixtures :all
2752

2853
# Add more helper methods to be used by all tests here...
54+
include FactoryBot::Syntax::Methods
2955
end
3056
end
3157

0 commit comments

Comments
 (0)