Пример #1
0
    def test_stops_count(self):
        """Test Agency stop counts"""
        agency = factories.AgencyFactory()
        # Create the following racial data for 2010:
        # 2 black, 1 white, 3 hispanic
        factories.PersonFactory(race="B", stop__agency=agency, ethnicity="N", stop__year=2010)
        factories.PersonFactory(race="B", stop__agency=agency, ethnicity="N", stop__year=2010)
        factories.PersonFactory(race="W", stop__agency=agency, ethnicity="N", stop__year=2010)
        factories.PersonFactory(race="W", stop__agency=agency, ethnicity="H", stop__year=2010)
        factories.PersonFactory(race="A", stop__agency=agency, ethnicity="H", stop__year=2010)
        factories.PersonFactory(race="A", stop__agency=agency, ethnicity="H", stop__year=2010)
        # Create the following racial data for 2012:
        # 0 black, 1 white, 4 hispanic
        factories.PersonFactory(race="W", stop__agency=agency, ethnicity="H", stop__year=2012)
        factories.PersonFactory(race="W", stop__agency=agency, ethnicity="N", stop__year=2012)
        factories.PersonFactory(race="B", stop__agency=agency, ethnicity="H", stop__year=2012)
        factories.PersonFactory(race="B", stop__agency=agency, ethnicity="H", stop__year=2012)
        factories.PersonFactory(race="I", stop__agency=agency, ethnicity="H", stop__year=2012)

        url = reverse("nc:agency-api-stops", args=[agency.pk])
        response = self.client.get(url, format="json")
        self.assertEqual(len(response.data), 2)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data[0]["year"], 2010)
        self.assertEqual(response.data[0]["black"], 2)
        self.assertEqual(response.data[0]["white"], 1)
        self.assertEqual(response.data[0]["asian"], 0)
        self.assertEqual(response.data[0]["hispanic"], 3)
        self.assertEqual(response.data[1]["year"], 2012)
        self.assertEqual(response.data[1]["black"], 0)
        self.assertEqual(response.data[1]["white"], 1)
        self.assertEqual(response.data[1]["hispanic"], 4)
Пример #2
0
 def test_stops_api(self):
     """Test Agency stops API endpoint with no stops"""
     agency = factories.AgencyFactory()
     url = reverse('nc:agency-api-stops', args=[agency.pk])
     response = self.client.get(url, format='json')
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 0)
Пример #3
0
 def test_grouping_by_year(self):
     """
     Create one stop right at the end of the year in North Carolina and another
     stop a day later and ensure that the stops are counted in the expected
     years.
     """
     nc_timezone = pytz.timezone(settings.NC_TIME_ZONE)
     year = 2015
     end_of_year = nc_timezone.localize(
         datetime.datetime(year=year, month=12, day=31, hour=23, minute=59,)
     )
     agency = factories.AgencyFactory()
     race_code, _ = RACE_CHOICES[1]
     race_label = GROUPS[race_code]
     factories.PersonFactory(
         race=race_code, ethnicity="N", stop__agency=agency, stop__date=end_of_year
     )
     factories.PersonFactory(
         race=race_code,
         ethnicity="H",
         stop__agency=agency,
         stop__date=end_of_year + datetime.timedelta(days=1),
     )
     url = reverse("nc:agency-api-stops", args=[agency.pk])
     response = self.client.get(url, format="json")
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 2)
     self.assertEqual(response.data[0]["year"], year)
     self.assertEqual(response.data[0][race_label], 1)
     self.assertEqual(response.data[1]["year"], year + 1)
     self.assertEqual(response.data[1]["hispanic"], 1)
Пример #4
0
 def test_searches(self):
     """Test Agency search counts"""
     agency = factories.AgencyFactory()
     # Create the following racial data for 2015: 1 black
     p1 = factories.PersonFactory(race="B", ethnicity="N", stop__agency=agency, stop__year=2015)
     s1 = factories.SearchFactory(person=p1, stop=p1.stop)
     # Create the following racial data for 2016: 1 native american, 3 hispanic
     p2 = factories.PersonFactory(race="W", ethnicity="H", stop__agency=agency, stop__year=2016)
     s2 = factories.SearchFactory(person=p2, stop=p2.stop)
     p3 = factories.PersonFactory(race="B", ethnicity="H", stop__agency=agency, stop__year=2016)
     factories.SearchFactory(person=p3, stop=p3.stop)
     p4 = factories.PersonFactory(race="B", ethnicity="H", stop__agency=agency, stop__year=2016)
     factories.SearchFactory(person=p4, stop=p4.stop)
     p5 = factories.PersonFactory(race="I", ethnicity="N", stop__agency=agency, stop__year=2016)
     factories.SearchFactory(person=p5, stop=p5.stop)
     url = reverse("nc:agency-api-searches", args=[agency.pk])
     response = self.client.get(url, format="json")
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 2)
     # Everyone got searched, so the expected racial data for 2015 are: 1 black,
     # and for 2016 are: 1 native american, 3 hispanic
     self.assertEqual(response.data[0]["year"], s1.stop.date.year)
     self.assertEqual(response.data[0]["black"], 1)
     self.assertEqual(response.data[1]["year"], s2.stop.date.year)
     self.assertEqual(response.data[1]["black"], 0)
     self.assertEqual(response.data[1]["native_american"], 1)
     self.assertEqual(response.data[1]["hispanic"], 3)
Пример #5
0
 def test_list_agencies(self):
     """Test Agency list"""
     agency = factories.AgencyFactory()
     url = reverse("nc:agency-api-list")
     response = self.client.get(url, format="json")
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     # Other Agencies may have been left around from other tests
     self.assertIn((agency.pk, agency.name), [(a["id"], a["name"]) for a in response.data])
Пример #6
0
    def test_searches_by_reason(self):
        agency = factories.AgencyFactory()
        url = reverse("nc:agency-api-searches-by-type", args=[agency.pk])

        type_code, type_label = SEARCH_TYPE_CHOICES[2]

        # Create the following racial data for 2015: 1 black
        p1 = factories.PersonFactory(race="B", ethnicity="N", stop__agency=agency, stop__year=2015)
        factories.SearchFactory(
            person=p1, stop=p1.stop, type=type_code,
        )

        # Create the following racial data for 2016: 1 native american, 3 hispanic
        p2 = factories.PersonFactory(race="W", ethnicity="H", stop__agency=agency, stop__year=2016)
        factories.SearchFactory(
            person=p2, stop=p2.stop, type=type_code,
        )
        p3 = factories.PersonFactory(race="B", ethnicity="H", stop__agency=agency, stop__year=2016)
        factories.SearchFactory(
            person=p3, stop=p3.stop, type=type_code,
        )
        p4 = factories.PersonFactory(race="B", ethnicity="H", stop__agency=agency, stop__year=2016)
        factories.SearchFactory(
            person=p4, stop=p4.stop, type=type_code,
        )
        p5 = factories.PersonFactory(race="I", ethnicity="N", stop__agency=agency, stop__year=2016)
        factories.SearchFactory(
            person=p5, stop=p5.stop, type=type_code,
        )

        response = self.client.get(url, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        # Two years = two items
        self.assertEqual(len(response.data), 2)

        searches = response.data
        self.assertEqual(
            searches[0]["year"], 2015,
        )
        self.assertEqual(
            searches[0]["black"], 1,
        )
        self.assertEqual(
            searches[0]["search_type"], type_label,
        )
        self.assertEqual(
            searches[1]["year"], 2016,
        )
        self.assertEqual(
            searches[1]["hispanic"], 3,
        )
        self.assertEqual(
            searches[1]["native_american"], 1,
        )
        self.assertEqual(
            searches[1]["search_type"], type_label,
        )
Пример #7
0
 def test_agency_census_data(self):
     """
     Construct an agency with associated CensusProfile, check
     for inclusion of reasonable data
     """
     census_profile = CensusProfileFactory()
     agency = factories.AgencyFactory(census_profile_id=census_profile.id)
     url = reverse("nc:agency-api-detail", args=[agency.pk])
     response = self.client.get(url, format="json")
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertIn("census_profile", response.data)
     # CensusProfile tests check census data in more detail
     for attr in ("hispanic", "non_hispanic", "total"):
         self.assertEqual(response.data["census_profile"][attr], getattr(census_profile, attr))
Пример #8
0
    def test_contraband_hit_rate(self):
        agency = factories.AgencyFactory()
        # Create the following racial data for 2010:
        # 1 black, 1 native american, 3 hispanic
        p1 = factories.PersonFactory(race="B", stop__agency=agency, ethnicity="N", stop__year=2010)
        p2 = factories.PersonFactory(race="B", stop__agency=agency, ethnicity="H", stop__year=2010)
        p3 = factories.PersonFactory(race="I", stop__agency=agency, ethnicity="N", stop__year=2010)
        p4 = factories.PersonFactory(race="I", stop__agency=agency, ethnicity="H", stop__year=2010)
        p5 = factories.PersonFactory(race="I", stop__agency=agency, ethnicity="H", stop__year=2010)
        # Create the following racial data for 2012: 1 black
        p6 = factories.PersonFactory(race="B", stop__agency=agency, ethnicity="N", stop__year=2012)
        s1 = factories.SearchFactory(stop=p1.stop)
        factories.SearchFactory(stop=p2.stop)
        s3 = factories.SearchFactory(stop=p3.stop)
        s4 = factories.SearchFactory(stop=p4.stop)
        s5 = factories.SearchFactory(stop=p5.stop)
        s6 = factories.SearchFactory(stop=p6.stop)
        factories.ContrabandFactory(search=s1, person=p1, stop=p1.stop)
        factories.ContrabandFactory(search=s3, person=p3, stop=p3.stop)
        factories.ContrabandFactory(search=s4, person=p4, stop=p4.stop)
        factories.ContrabandFactory(search=s5, person=p5, stop=p5.stop)
        factories.ContrabandFactory(search=s6, person=p6, stop=p6.stop)
        url = reverse("nc:agency-api-contraband-hit-rate", args=[agency.pk])
        response = self.client.get(url, format="json")
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data.keys()), 2)

        searches = response.data["searches"]
        # The expected search data matches the created data, since each of the
        # people were searched
        self.assertEqual(searches[0]["year"], 2010)
        self.assertEqual(searches[0]["black"], 1)
        self.assertEqual(searches[0]["native_american"], 1)
        self.assertEqual(searches[0]["hispanic"], 3)
        self.assertEqual(searches[1]["year"], 2012)
        self.assertEqual(searches[1]["black"], 1)

        contraband = response.data["contraband"]
        # Everyone had contraband, except for p2, so the expected contraband data
        # for 2010 are: 1 black, 1 native american, 2 hispanic, and for 2012
        # are: 1 black
        self.assertEqual(contraband[0]["year"], 2010)
        self.assertEqual(contraband[0]["black"], 1)
        self.assertEqual(contraband[0]["native_american"], 1)
        self.assertEqual(contraband[0]["hispanic"], 2)
        self.assertEqual(contraband[1]["year"], 2012)
        self.assertEqual(contraband[1]["black"], 1)
Пример #9
0
 def test_officer_stops_count(self):
     """Test officer (within an agency) stop counts"""
     agency = factories.AgencyFactory()
     p1 = factories.PersonFactory(ethnicity="N", stop__agency=agency, stop__year=2016)
     p2 = factories.PersonFactory(
         ethnicity="H", stop__agency=agency, stop__year=2017, stop__officer_id=p1.stop.officer_id
     )
     factories.PersonFactory(
         ethnicity="H", stop__agency=agency, stop__year=2017, stop__officer_id=p1.stop.officer_id
     )
     url = reverse("nc:agency-api-stops", args=[agency.pk])
     url = "{}?officer={}".format(url, p1.stop.officer_id)
     response = self.client.get(url, format="json")
     self.assertEqual(response.status_code, status.HTTP_200_OK)
     self.assertEqual(len(response.data), 2)
     self.assertEqual(response.data[0]["year"], p1.stop.date.year)
     self.assertEqual(response.data[0][GROUPS[p1.race]], 1)
     self.assertEqual(response.data[1]["year"], p2.stop.date.year)
     self.assertEqual(response.data[1]["hispanic"], 2)
Пример #10
0
    def test_agency_list_sorted_agencies(self):
        """
        Verify that agencies are delivered in an appropriately sorted and
        chunked form.
        """
        factories.AgencyFactory(name="Abc")
        factories.AgencyFactory(name="Def")
        factories.AgencyFactory(name="Ghi")
        factories.AgencyFactory(name="Abc_")
        factories.AgencyFactory(name="Def_")
        factories.AgencyFactory(name="Ghi_")
        factories.AgencyFactory(name="Abc__")
        factories.AgencyFactory(name="Def__")
        factories.AgencyFactory(name="Ghi__")
        factories.AgencyFactory(name="Abc___")
        factories.AgencyFactory(name="Def___")
        factories.AgencyFactory(name="Ghi___")
        factories.AgencyFactory(name="Abc____")
        factories.AgencyFactory(name="Def____")
        factories.AgencyFactory(name="Ghi____")

        response = self.client.get(reverse('nc:agency-list'))
        sorted_agencies = response.context['sorted_agencies']

        # Verify that there are three alphabetic categories
        self.assertEqual(3, len(sorted_agencies))

        keys = [pair[0] for pair in sorted_agencies]
        # Verify that the relevant letters are in there
        self.assertTrue("A" in keys)
        self.assertTrue("D" in keys)
        self.assertTrue("G" in keys)

        # Verify that each alphabetic category contains three chunks
        # with the appropriate number of pieces (i.e. 2, 2, 1)
        for (letter, chunks) in sorted_agencies:
            self.assertEqual(3, len(chunks))
            self.assertEqual(2, len(chunks[0]))
            self.assertEqual(2, len(chunks[1]))
            self.assertEqual(1, len(chunks[2]))
Пример #11
0
 def test_agency_detail(self):
     agency = factories.AgencyFactory(name="Durham")
     response = self.client.get(
         reverse('nc:agency-detail', args=[agency.pk]))
     self.assertEqual(200, response.status_code)
Пример #12
0
    def test_stops_count(self):
        """Test Agency stop counts"""
        agency = factories.AgencyFactory()
        # Create the following racial data for 2010:
        # 2 black, 1 white, 3 hispanic
        factories.PersonFactory(race='B',
                                stop__agency=agency,
                                ethnicity='N',
                                stop__year=2010)
        factories.PersonFactory(race='B',
                                stop__agency=agency,
                                ethnicity='N',
                                stop__year=2010)
        factories.PersonFactory(race='W',
                                stop__agency=agency,
                                ethnicity='N',
                                stop__year=2010)
        factories.PersonFactory(race='W',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2010)
        factories.PersonFactory(race='A',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2010)
        factories.PersonFactory(race='A',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2010)
        # Create the following racial data for 2012:
        # 0 black, 1 white, 4 hispanic
        factories.PersonFactory(race='W',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2012)
        factories.PersonFactory(race='W',
                                stop__agency=agency,
                                ethnicity='N',
                                stop__year=2012)
        factories.PersonFactory(race='B',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2012)
        factories.PersonFactory(race='B',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2012)
        factories.PersonFactory(race='I',
                                stop__agency=agency,
                                ethnicity='H',
                                stop__year=2012)

        url = reverse('nc:agency-api-stops', args=[agency.pk])
        response = self.client.get(url, format='json')
        self.assertEqual(len(response.data), 2)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(response.data[0]['year'], 2010)
        self.assertEqual(response.data[0]['black'], 2)
        self.assertEqual(response.data[0]['white'], 1)
        self.assertEqual(response.data[0]['asian'], 0)
        self.assertEqual(response.data[0]['hispanic'], 3)
        self.assertEqual(response.data[1]['year'], 2012)
        self.assertEqual(response.data[1]['black'], 0)
        self.assertEqual(response.data[1]['white'], 1)
        self.assertEqual(response.data[1]['hispanic'], 4)
Пример #13
0
    def test_stops_by_reason(self):
        """Test Agency stops_by_reason API endpoint"""
        agency = factories.AgencyFactory()
        url = reverse('nc:agency-api-stops-by-reason', args=[agency.pk])

        purpose_code, purpose_label = PURPOSE_CHOICES[4]
        # Create the following racial data for 2010: 2 black, 3 hispanic
        factories.PersonFactory(race='B',
                                stop__agency=agency,
                                ethnicity='N',
                                stop__year=2010,
                                stop__purpose=purpose_code)
        p2 = factories.PersonFactory(race='B',
                                     stop__agency=agency,
                                     ethnicity='H',
                                     stop__year=2010,
                                     stop__purpose=purpose_code)
        p3 = factories.PersonFactory(race='I',
                                     stop__agency=agency,
                                     ethnicity='H',
                                     stop__year=2010,
                                     stop__purpose=purpose_code)
        p4 = factories.PersonFactory(race='I',
                                     stop__agency=agency,
                                     ethnicity='H',
                                     stop__year=2010,
                                     stop__purpose=purpose_code)
        # Create the following racial data for 2012: 1 black
        p5 = factories.PersonFactory(race='B',
                                     stop__agency=agency,
                                     ethnicity='N',
                                     stop__year=2012,
                                     stop__purpose=purpose_code)
        # Everyone except for the first person got searched, so the expected
        # search data for 2010 are: 1 black, 3 hispanic, and for 2012 is: 1 black
        factories.SearchFactory(stop=p2.stop)
        factories.SearchFactory(stop=p3.stop)
        factories.SearchFactory(stop=p4.stop)
        factories.SearchFactory(stop=p5.stop)

        response = self.client.get(url, format='json')
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data.keys()), 2)

        searches = response.data['searches']
        self.assertEqual(searches[0]['year'], 2010)
        self.assertEqual(searches[0]['black'], 0)
        self.assertEqual(searches[0]['hispanic'], 3)
        self.assertEqual(searches[0]['purpose'], purpose_label)
        self.assertEqual(searches[1]['year'], 2012)
        self.assertEqual(searches[1]['black'], 1)
        self.assertEqual(searches[1]['purpose'], purpose_label)

        stops = response.data['stops']
        self.assertEqual(stops[0]['year'], 2010)
        self.assertEqual(stops[0]['black'], 1)
        self.assertEqual(stops[0]['hispanic'], 3)
        self.assertEqual(stops[0]['purpose'], purpose_label)
        self.assertEqual(stops[1]['year'], 2012)
        self.assertEqual(stops[1]['black'], 1)
        self.assertEqual(stops[1]['purpose'], purpose_label)
Пример #14
0
def durham():
    return factories.AgencyFactory(name="Durham")