diff --git a/app/interactors/find_user_by_reset_token.rb b/app/interactors/find_user_by_reset_token.rb index de93e0c..340c864 100644 --- a/app/interactors/find_user_by_reset_token.rb +++ b/app/interactors/find_user_by_reset_token.rb @@ -1,6 +1,19 @@ -class FindUserByResetToken - include Interactor +class FindUserByResetToken < StandardInteraction + def validate_input + context.fail!(errors: "invalid input") unless context.reset_token + end + + def execute + context.user = User.find_by(reset_digest: digest_token) + end + + def validate_output + context.fail!(errors: "invalid output") unless context.user + end + + private - def call + def digest_token + Encryptor.digest_token(context.reset_token) end end diff --git a/spec/interactors/find_user_by_reset_token_spec.rb b/spec/interactors/find_user_by_reset_token_spec.rb new file mode 100644 index 0000000..0cc9eb7 --- /dev/null +++ b/spec/interactors/find_user_by_reset_token_spec.rb @@ -0,0 +1,57 @@ +RSpec.describe FindUserByResetToken do + describe ".call" do + let(:token) { Encryptor.generate_token } + + context "when successful" do + let!(:user) { create(:confirmed_user, reset_digest: token[0]) } + + subject do + described_class.call(reset_token: token[1]) + end + + it "is a success" do + is_expected.to be_a_success + end + + it "find the user" do + expect(subject.user).to eq(user) + end + end + + context "when reset token not provided" do + before do + create(:confirmed_user, reset_digest: token[0]) + end + + subject do + described_class.call(reset_token: nil) + end + + it "fails" do + is_expected.to be_a_failure + end + + it "adds an error to errors" do + expect(subject.errors).to eq("invalid input") + end + end + + context "when user not found" do + before do + create(:confirmed_user, reset_digest: "differenttoken") + end + + subject do + described_class.call(reset_token: token[1]) + end + + it "fails" do + is_expected.to be_a_failure + end + + it "adds an error to errors" do + expect(subject.errors).to eq("invalid output") + end + end + end +end