540co/epa-rfi

View on GitHub
src/app/services/reports.service.spec.js

Summary

Maintainability
D
2 days
Test Coverage
(function() {
  'use strict';

  describe('ReportService', function() {
    var ReportService,
      DataServiceMock,
      $q;

    beforeEach(function() {
      module('app.services', function($provide) {
        $provide.constant('TRI_API_ENDPOINT', 'MOCK_TRI_ENPOINT');
      });
    });

    beforeEach(inject(function (_ReportService_, _DataService_, _$q_) {
      ReportService = _ReportService_;
      DataServiceMock = _DataService_;
      $q = _$q_;
    }));

    it('should calculate report of yearly air pollution totals', function(done) {
      var expectedPoundsQueryParams = {
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir',
          'filters': 'unitOfMeasure:Pounds'
        },
        expectedGramsQueryParams = {
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir',
          'filters': 'unitOfMeasure:Grams'
        },
        mockPoundsReportData = {
          meta: {},
          data: [
            {
              year: 2002,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              }
            },
            {
              year: 2000,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 900,
                stackAir: 1400
              }
            },
            {
              year: 2001,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 500,
                stackAir: 875
              }
            },
            {
              year: 2003,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              }
            }
          ]
        },
        mockGramsReportData = {
          meta: {},
          data: [
            {
              year: 2004,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 45359.2370380378298,
                stackAir: 45359.2370380378298
              }
            },
            {
              year: 2000,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 45359.2370380378298,
                stackAir: 45359.2370380378298
              }
            }
          ]
        },
        expectedData = {
          report: [
            {
              year: 2000,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 1000,
                stackAir: 1500
              },
              total: 2500
            },
            {
              year: 2001,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 500,
                stackAir: 875
              },
              total: 1375
            },
            {
              year: 2002,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              },
              total: 300
            },
            {
              year: 2003,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              },
              total: 300
            },
            {
              year: 2004,
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 100
              },
              total: 200
            }
          ],
          totalProduction: 4675,
          totalReduction: 7825,
          cumulativeReductionPercentage: 0.626,
          years: [2000,2001,2002,2003,2004],
          totalAirPerYear: [2500,1375,300,300,200],
          fugitiveAirPerYear: [1000,500,100,100,100],
          stackAirPerYear: [1500,875,200,200,100]
        },
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn($q, 'all').and.callFake(function() {
        return {
          then: function(successCallback) {
            successCallback([mockPoundsReportData, mockGramsReportData]);
          }
        }
      })

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({}, function(data) {
        expect(data).toEqual(expectedData);

        done();
      }, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query).toHaveBeenCalledWith(expectedPoundsQueryParams);
      expect(DataServiceMock.CleanAirActReports.query).toHaveBeenCalledWith(expectedGramsQueryParams);

      expect(errorCallback).not.toHaveBeenCalled();
    });

    it('should use error callback if report query fails', function() {
      var successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn($q, 'all').and.callFake(function() {
        return {
          then: function(successCallback, errorCallback) {
            errorCallback();
          }
        };
      });

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({}, successCallback, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query).toHaveBeenCalled();

      expect(successCallback).not.toHaveBeenCalled();
      expect(errorCallback).toHaveBeenCalled();
    });

    it('should add start/end year to query params', function() {
      var expectedPoundsQueryParams = {
          'filters': 'year:[2005 TO 2009] AND unitOfMeasure:Pounds',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        expectedGramsQueryParams = {
            'filters': 'year:[2005 TO 2009] AND unitOfMeasure:Grams',
            'groupBy': 'year',
            'operation': 'sum',
            'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
          },
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({
          start_year: 2005,
          end_year: 2009
        }, successCallback, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(0)).toEqual([expectedPoundsQueryParams]);
      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(1)).toEqual([expectedGramsQueryParams]);
    });

    it('should add start year to query params', function() {
      var expectedPoundsQueryParams = {
          'filters': 'year:[2005 TO *] AND unitOfMeasure:Pounds',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        expectedGramsQueryParams = {
          'filters': 'year:[2005 TO *] AND unitOfMeasure:Grams',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({
          start_year: 2005
        }, successCallback, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(0)).toEqual([expectedPoundsQueryParams]);
      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(1)).toEqual([expectedGramsQueryParams]);
    });

    it('should add end year to query params', function() {
      var expectedPoundsQueryParams = {
          'filters': 'year:[* TO 2009] AND unitOfMeasure:Pounds',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        expectedGramsQueryParams = {
          'filters': 'year:[* TO 2009] AND unitOfMeasure:Grams',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({
          end_year: 2009
        }, successCallback, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(0)).toEqual([expectedPoundsQueryParams]);
      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(1)).toEqual([expectedGramsQueryParams]);
    });

    it('should add filters to query params', function() {
      var expectedPoundsQueryParams = {
          'filters': 'year:[2005 TO 2009] AND facility.address.state:TX AND facility.address.county:HARRIS AND unitOfMeasure:Pounds',
          'groupBy': 'year',
          'operation': 'sum',
          'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
        },
        expectedGramsQueryParams = {
            'filters': 'year:[2005 TO 2009] AND facility.address.state:TX AND facility.address.county:HARRIS AND unitOfMeasure:Grams',
            'groupBy': 'year',
            'operation': 'sum',
            'agg_fields': 'quantitiesEnteringEnvironment.fugitiveAir,quantitiesEnteringEnvironment.stackAir'
          },
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback');

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function() {
        return {
          $promise: {}
        };
      });

      ReportService.getYearlyAirPollutionReport({
          start_year: 2005,
          end_year: 2009,
          state: 'TX',
          county: 'HARRIS'
        }, successCallback, errorCallback);

      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(0)).toEqual([expectedPoundsQueryParams]);
      expect(DataServiceMock.CleanAirActReports.query.calls.argsFor(1)).toEqual([expectedGramsQueryParams]);
    });


    it('should build a list of states that we have report data for', function() {
      var mockReportData = {
          meta: {},
          data: [
            {
              facility: {
                address: {
                  state: 'TX'
                }
              },
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              }
            },
            {
              facility: {
                address: {
                  state: 'FL'
                }
              },
              quantitiesEnteringEnvironment: {
                fugitiveAir: 100,
                stackAir: 200
              }
            }
          ]
        },
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback'),
        expectedStateList = ['FL', 'TX'];

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function(queryParams, successCallback) {
        successCallback(mockReportData);
        return {
          $promise: {}
        };
      });

      ReportService.getStateList(successCallback, errorCallback);

      expect(successCallback).toHaveBeenCalledWith(expectedStateList);
      expect(errorCallback).not.toHaveBeenCalled();
    });

    it('should call error callback if error occurs pulling state list', function() {
      var
        successCallback = jasmine.createSpy('successCallback'),
        errorCallback = jasmine.createSpy('errorCallback'),
        expectedError = {
          status: 500,
          statusText: 'some error',
          data: {}
        };

      spyOn(DataServiceMock.CleanAirActReports, 'query').and.callFake(function(queryParams, successCallback, errorCallback) {
        errorCallback(expectedError);
        return {
          $promise: {}
        };
      });

      ReportService.getStateList(successCallback, errorCallback);

      expect(successCallback).not.toHaveBeenCalled();
      expect(errorCallback).toHaveBeenCalledWith(expectedError);
    });
  });
})();