problems_controller_spec.rb 3.57 KB
describe Api::V1::ProblemsController, type: 'controller' do
  context "when logged in" do
    before do
      @user = Fabricate(:user)
    end

    describe "GET /api/v1/problems/:id" do
      before do
        notice = Fabricate(:notice)
        err = Fabricate(:err, notices: [notice])
        @problem = Fabricate(:problem, errs: [err])
      end

      it "should return JSON if JSON is requested" do
        get :show, auth_token: @user.authentication_token, format: "json", id: Problem.first.id
        expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError
      end

      it "should return XML if XML is requested" do
        get :index, auth_token: @user.authentication_token, format: "xml", id: @problem.id
        expect(Nokogiri::XML(response.body).errors).to be_empty
      end

      it "should return JSON by default" do
        get :show, auth_token: @user.authentication_token, id: @problem.id
        expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
      end

      it "should return the correct problem" do
        get :show, auth_token: @user.authentication_token, format: "json", id: @problem.id

        returned_problem = JSON.parse(response.body)
        expect(returned_problem["_id"]).to eq(@problem.id.to_s)
      end

      it "should return only the correct fields" do
        get :show, auth_token: @user.authentication_token, format: "json", id: @problem.id
        returned_problem = JSON.parse(response.body)

        expect(returned_problem.keys).to match_array(%w(
          app_name
          first_notice_at
          message
          app_id
          last_notice_at
          _id
          resolved
          resolved_at
          where
          notices_count
          environment))
      end

      it "returns a 404 if the problem cannot be found" do
        get :show, auth_token: @user.authentication_token, format: "json", id: 'IdontExist'
        expect(response.status).to eq(404)
      end
    end

    describe "GET /api/v1/problems" do
      before do
        Fabricate(:problem, first_notice_at: Date.new(2012, 8, 01), resolved_at: Date.new(2012, 8, 02))
        Fabricate(:problem, first_notice_at: Date.new(2012, 8, 01), resolved_at: Date.new(2012, 8, 21))
        Fabricate(:problem, first_notice_at: Date.new(2012, 8, 21))
        Fabricate(:problem, first_notice_at: Date.new(2012, 8, 30))
      end

      it "should return JSON if JSON is requested" do
        get :index, auth_token: @user.authentication_token, format: "json"
        expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
      end

      it "should return XML if XML is requested" do
        get :index, auth_token: @user.authentication_token, format: "xml"
        expect(Nokogiri::XML(response.body).errors).to be_empty
      end

      it "should return JSON by default" do
        get :index, auth_token: @user.authentication_token
        expect { JSON.load(response.body) }.not_to raise_error # JSON::ParserError)
      end

      describe "given a date range" do
        it "should return only the problems open during the date range" do
          get :index, auth_token: @user.authentication_token, start_date: "2012-08-20", end_date: "2012-08-27"
          expect(response).to be_success
          problems = JSON.load response.body
          expect(problems.length).to eq 2
        end
      end

      it "should return all problems" do
        get :index, auth_token: @user.authentication_token
        expect(response).to be_success
        problems = JSON.load response.body
        expect(problems.length).to eq 4
      end
    end
  end
end