# frozen_string_literal: true require "rails_helper" describe NotificationsController do include ActiveSupport::Testing::TimeHelpers describe "#index" do subject { get :index, params: { type: :new } } let(:original_notifications_updated_at) { 1.day.ago } let(:user) { FactoryBot.create(:user) } before do sign_in(user) end context "user has no notifications" do it "should show an empty list" do subject expect(response).to render_template(:index) expect(controller.instance_variable_get(:@notifications)).to be_empty end end context "user has notifications" do let(:other_user) { FactoryBot.create(:user) } let(:another_user) { FactoryBot.create(:user) } let(:question) { FactoryBot.create(:question, user:) } let!(:answer) { FactoryBot.create(:answer, question:, user: other_user) } let!(:subscription) { Subscription.create(user:, answer:) } let!(:comment) { FactoryBot.create(:comment, answer:, user: other_user) } it "should show a list of notifications" do subject expect(response).to render_template(:index) expect(controller.instance_variable_get(:@notifications)).to have_attributes(size: 2) end it "marks notifications as read" do expect { subject }.to change { Notification.for(user).where(new: true).count }.from(2).to(0) end it "updates the the timestamp used for caching" do user.update(notifications_updated_at: original_notifications_updated_at) travel 1.second do expect { subject }.to change { user.reload.notifications_updated_at }.from(original_notifications_updated_at).to(Time.now.utc) end end end end describe "#read" do subject { post :read, format: :turbo_stream } let(:recipient) { FactoryBot.create(:user) } let(:notification_count) { rand(8..20) } context "user has some unread notifications" do before do notification_count.times do FactoryBot.create(:user).follow(recipient) end sign_in(recipient) end it "marks all notifications as read" do expect { subject }.to change { Notification.where(recipient:, new: true).count }.from(notification_count).to(0) end end end end