earlymarket/CoPosition

View on GitHub
spec/presenters/users/devices/devices_show_presenter_spec.rb

Summary

Maintainability
A
1 hr
Test Coverage
require "rails_helper"

describe ::Users::Devices::DevicesShowPresenter do
  subject(:show_presenter) { described_class.new(user, id: device.id) }
  let(:user) { create(:user) }
  let(:device) { create(:device, user_id: user.id) }
  let(:checkins) do
    create(:checkin, device_id: device.id, created_at: 1.hour.ago)
    create(:checkin, device_id: device.id, created_at: 2.hours.ago).reverse_geocode!
    create(:checkin, device_id: device.id, created_at: 3.hours.ago)
  end

  describe "Interface" do
    %i(user device checkins filename date_range show_gon form_for form_path form_range_filter).each do |method|
      it { is_expected.to respond_to method }
    end
  end

  describe "user" do
    it "returns user" do
      expect(show_presenter.user).to eq user
    end
  end

  describe "device" do
    it "returns a device" do
      expect(show_presenter.device).to be_kind_of Device
    end
  end

  describe "checkins" do
    it "returns nil if no download params" do
      expect(show_presenter.checkins).to be_nil
    end

    it "returns checkins converted to param provided" do
      checkins
      show_presenter = described_class.new(user, id: device.id, download: "gpx")
      expect(show_presenter.checkins).to eq device.checkins.unscope(:order).order(created_at: :asc).to_gpx
    end
  end

  describe "filename" do
    it "returns nil if no download params" do
      expect(show_presenter.filename).to be_nil
    end

    it "returns a string" do
      show_presenter = described_class.new(user, id: device.id, download: "gpx")
      expect(show_presenter.filename).to be_kind_of String
    end
  end

  describe "date_range" do
    before { checkins }

    it "returns date of first and last check-in being shown on first load" do
      show_presenter = described_class.new(user, id: device.id, first_load: true)
      expect(show_presenter.date_range).to eq from: Checkin.last.created_at.beginning_of_day, to: Time.zone.today
    end

    it "returns date selected if params provided" do
      show_presenter = described_class.new(user, id: device.id, from: Date.yesterday.strftime, to: Date.today.strftime)
      expect(show_presenter.date_range).to eq from: Date.yesterday.beginning_of_day, to: Date.today.end_of_day
    end

    it "returns nil range if no date range" do
      show_presenter = described_class.new(user, id: device.id)
      expect(show_presenter.date_range).to eq from: nil, to: nil
    end
  end

  describe "show_gon" do
    it "returns a hash" do
      expect(show_presenter.show_gon).to be_kind_of Hash
    end

    it "calls gon_show_checkins" do
      allow(show_presenter).to receive(:gon_show_checkins).and_return device.checkins
      show_presenter.show_gon
      expect(show_presenter).to have_received(:gon_show_checkins).at_least(1).times
    end
  end

  describe "form_for" do
    it "returns a Device" do
      expect(show_presenter.form_for).to be_kind_of Device
    end
  end

  describe "form_path" do
    it "returns show device path" do
      expect(show_presenter.form_path).to eq "/users/#{user.url_id}/devices/#{device.id}"
    end
  end

  describe "form_range_filter" do
    let(:date) { 1.week.ago }
    let(:output) { show_presenter.form_range_filter("range", date) }

    it "returns a link containing the provided text to get checkins for a certain range" do
      expect(output).to match "range"
    end

    it "returns a link containing the provided range" do
      expect(output).to match date.to_date.to_s
    end
  end

  describe "gon_show_checkins" do
    it "returns an ActiveRecord AssociationRelation" do
      expect(show_presenter.send(:gon_show_checkins)).to be_kind_of ActiveRecord::Associations::CollectionProxy
    end
  end

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

    context "with checkins" do
      it "removes excess attributes" do
        checkins
        expect(show_presenter.send(:gon_show_checkins_paginated)[0]).not_to respond_to(:fogged_lat)
      end
    end
  end
end