master
1require 'rails_helper'
2
3describe User do
4 describe "validations" do
5 subject { build(:user) }
6
7 it 'validates the email' do
8 subject.email = 'blah'
9 expect(subject.valid?).to be_falsey
10 expect(subject.errors[:email]).to_not be_empty
11 end
12
13 it 'validates the presence of the email' do
14 subject.email = nil
15 expect(subject.valid?).to be_falsey
16 expect(subject.errors[:email]).to_not be_empty
17 end
18
19 it 'validates the presence of a password' do
20 subject.password = nil
21 expect(subject.valid?).to be_falsey
22 expect(subject.errors[:password]).to_not be_empty
23 end
24 end
25
26 describe "when a website url is supplied" do
27 describe "when the url is valid" do
28 let(:user) { build(:user) }
29
30 before(:each) { user.update_attribute(:website, 'http://example.com') }
31
32 it "can validate" do
33 expect(user.errors[:website].any?).to be_falsey
34 end
35
36 it "should not have any validation error messages" do
37 expect(user.errors[:website]).to be_empty
38 end
39 end
40
41 describe "when the url is not valid" do
42 let(:user) { User.new }
43
44 before(:each) { user.update(website: 'blah') }
45
46 it "cannot validate" do
47 expect(user.errors[:website].any?).to be_truthy
48 end
49
50 it "should have an error message" do
51 expect(user.errors[:website]).to match_array(["is invalid"])
52 end
53 end
54 end
55
56 describe "when checking if a user already likes a creation" do
57 subject { create(:user) }
58 let(:cake) { create(:creation) }
59
60 describe "when they do" do
61 it "returns true" do
62 subject.add_favorite(cake)
63 expect(subject.already_likes(cake)).to be_truthy
64 end
65 end
66
67 describe "when they do not" do
68 let(:result) { subject.already_likes(cake) }
69
70 it "should return false" do
71 expect(subject.already_likes(cake)).to be_falsey
72 end
73 end
74 end
75
76 describe "when a user adds a cake to their favorites" do
77 subject { create(:user) }
78 let!(:cake) { create(:creation) }
79
80 context "when the cake is already in their favorites" do
81 let!(:favorite) { create(:favorite, creation: cake, user: subject) }
82
83 it "should return their existing favorite" do
84 expect(subject.add_favorite(cake)).to eql(favorite)
85 end
86 end
87
88 context "when they have not liked it before" do
89 let(:result) { subject.add_favorite(cake) }
90
91 it "should return a new favorite" do
92 expect(result).to be_a(Favorite)
93 end
94
95 it "should specify the user" do
96 expect(result.user).to eql(subject)
97 end
98
99 it "should specify the creation" do
100 expect(result.creation).to eql(cake)
101 end
102 end
103 end
104
105 describe "send welcome email" do
106 let(:user) { build(:user) }
107 let(:mailer) { double("mailer", deliver_later: true) }
108
109 before :each do
110 allow(UserMailer).to receive(:welcome_email).with(user).and_return(mailer)
111 user.send_welcome_email
112 end
113
114 it "should send the email" do
115 expect(mailer).to have_received(:deliver_later)
116 end
117 end
118
119 describe ".login" do
120 context "when the email is not known" do
121 it "returns false" do
122 expect(User.login('blah@example.com', 'password')).to be_falsey
123 end
124 end
125
126 context "when the email is known" do
127 let(:user) { create(:user) }
128
129 before :each do
130 user.password = 'password'
131 user.save!
132 end
133
134 context "when the password is incorrect" do
135 it "returns false" do
136 expect(User.login(user.email, 'blah')).to be_falsey
137 end
138 end
139
140 context "when the password is correct" do
141 it "returns a new session" do
142 result = User.login(user.email, 'password')
143 expect(result).to be_truthy
144 expect(result).to_not be_new_record
145 expect(result.user).to eql(user)
146 end
147 end
148 end
149 end
150end