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