earlymarket/CoPosition

View on GitHub
spec/presenters/users/approvals_presenter_spec.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "rails_helper"

describe ::Users::ApprovalsPresenter do
  subject(:approvals) { described_class.new(user, approvable_type: "User") }
  let(:user) do
    us = create(:user)
    Approval.add_friend(us, friend)
    Approval.add_friend(friend, us)
    us
  end
  let(:friend) { create(:user) }
  let(:device) do
    device = create(:device, user_id: user.id)
    device.permitted_users << friend
  end

  describe "Interface" do
    %i[approvable_type approved complete pending complete devices gon input_options create_approval_url].each do |meth|
      it { is_expected.to respond_to meth }
    end
  end

  describe "approvable_type" do
    it "returns a string" do
      expect(approvals.approvable_type).to be_kind_of String
    end
  end

  describe "approved" do
    it "returns users_approved" do
      expect(approvals.approved).to eq approvals.send(:users_approved)
    end
  end

  describe "complete" do
    it "returns users_complete" do
      expect(approvals.complete).to eq approvals.send(:users_complete)
    end
  end

  describe "pending" do
    it "returns users_pending" do
      expect(approvals.pending).to eq approvals.send(:users_pending)
    end
  end

  describe "requested" do
    it "returns users_requested" do
      expect(approvals.requested).to eq approvals.send(:users_requested)
    end
  end

  describe "devices" do
    it "returns collection of devices" do
      expect(approvals.devices).to be_kind_of ActiveRecord::Associations::CollectionProxy
    end
  end

  describe "gon" do
    it "returns a hash" do
      expect(approvals.gon).to be_kind_of Hash
    end

    it "calls permissions" do
      allow(approvals).to receive(:permissions)
      approvals.gon
      expect(approvals).to have_received(:permissions)
    end

    it "calls friends_checkins" do
      allow(approvals).to receive(:checkins)
      approvals.gon
      expect(approvals).to have_received(:checkins)
    end
  end

  describe "permissions" do
    it "returns nil if no devices" do
      expect(approvals.send(:permissions)).to eq nil
    end

    context "with device" do
      before do
        device
      end

      it "returns an active record AssociationRelation" do
        expect(approvals.send(:permissions)).to be_kind_of ActiveRecord::AssociationRelation
      end

      it "calls Permission.not_coposition_developers" do
        allow(Permission).to receive(:not_coposition_developers)
        approvals.send(:permissions)
        expect(Permission).to have_received(:not_coposition_developers)
      end

      it "returns an array containing permissions" do
        expect(approvals.send(:permissions)[0]).to be_kind_of Permission
      end
    end
  end

  describe "users_approved" do
    it "returns an ActiveRecord AssociationRelation" do
      expect(approvals.send(:users_approved)).to be_kind_of ActiveRecord::AssociationRelation
    end

    context "users" do
      it "calls User.public_info" do
        allow(User).to receive(:public_info)
        approvals.send(:users_approved)
        expect(User).to have_received(:public_info).twice
      end
    end

    context "developers" do
      let(:approvals) { described_class.new(user, approvable_type: "Developer") }

      it "calls Developer.not_coposition_developers" do
        allow(Developer).to receive(:not_coposition_developers).and_return user.developers
        approvals.send(:users_approved)
        expect(Developer).to have_received(:not_coposition_developers).at_least(1).times
      end

      it "calls Developer.public_info" do
        allow(Developer).to receive(:public_info)
        approvals.send(:users_approved)
        expect(Developer).to have_received(:public_info).at_least(1).times
      end
    end
  end

  describe "users_complete" do
    context "users" do
      it "returns nil" do
        expect(approvals.send(:users_complete)).to eq nil
      end
    end

    context "developers" do
      let(:approvals) { described_class.new(user, approvable_type: "Developer") }

      it "returns an ActiveRecord AssociationRelation" do
        expect(approvals.send(:users_complete)).to be_kind_of ActiveRecord::AssociationRelation
      end

      it "calls Developer.not_coposition_developers" do
        allow(Developer).to receive(:not_coposition_developers).and_return user.developers
        approvals.send(:users_complete)
        expect(Developer).to have_received(:not_coposition_developers).at_least(1).times
      end

      it "calls Developer.public_info" do
        allow(Developer).to receive(:public_info)
        approvals.send(:users_complete)
        expect(Developer).to have_received(:public_info).at_least(1).times
      end
    end
  end

  describe "users_pending" do
    it "returns an ActiveRecord Associations CollectionProxy" do
      expect(approvals.send(:users_pending)).to be_kind_of ActiveRecord::Associations::CollectionProxy
    end

    context "users" do
      it "calls user.friend_requests" do
        allow(user).to receive(:friend_requests)
        approvals.send(:users_pending)
        expect(user).to have_received(:friend_requests).twice
      end
    end

    context "developers" do
      let(:approvals) { described_class.new(user, approvable_type: "Developer") }

      it "calls user.developer_requests" do
        allow(user).to receive(:developer_requests)
        approvals.send(:users_pending)
        expect(user).to have_received(:developer_requests).twice
      end
    end
  end

  describe "users_requested" do
    it "returns an ActiveRecord Associations CollectionProxy" do
      expect(approvals.send(:users_requested)).to be_kind_of Array
    end

    context "users" do
      it "calls user.pending_friends" do
        allow(user).to receive(:pending_friends)
        approvals.send(:users_requested)
        expect(user).to have_received(:pending_friends).twice
      end
    end
  end

  describe "friends_checkins" do
    it "returns nil if approvable_type is developer" do
      approvals = described_class.new(user, approvable_type: "Developer")
      expect(approvals.send(:friends_checkins)).to eq nil
    end

    it "returns an array" do
      expect(approvals.send(:friends_checkins)).to be_kind_of Array
    end

    it "returns an array of hashes" do
      # This test should pass, for some reason calling any method on a collection proxy returns nothing
      expect(approvals.send(:friends_checkins)[0]).to be_kind_of Hash
    end
  end

  describe "create_approval_url" do
    it "returns a path for creating developer approval" do
      approvals = described_class.new(user, approvable_type: "Developer")
      expect(approvals.create_approval_url).to match "create_dev_approvals"
    end

    it "returns a path for creating user approval" do
      expect(approvals.create_approval_url).to match "approvals"
    end
  end

  describe "input_options" do
    context "users" do
      it "assigns placeholder" do
        expect(approvals.input_options[:placeholder]).to match "email@email.com"
      end

      it "assigns class" do
        expect(approvals.input_options[:class]).to match "validate"
      end
    end

    context "developers" do
      let(:approvals) { described_class.new(user, approvable_type: "Developer") }

      it "assigns placeholder" do
        expect(approvals.input_options[:placeholder]).to match "name"
      end

      it "assigns class" do
        expect(approvals.input_options[:class]).to match "devs_typeahead"
      end
    end
  end
end