def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        event = Event(
            id="2011ct",
            end_date=datetime.datetime(2011, 4, 2, 0, 0),
            event_short="ct",
            event_type_enum=EventType.REGIONAL,
            first_eid="5561",
            name="Northeast Utilities FIRST Connecticut Regional",
            start_date=datetime.datetime(2011, 3, 31, 0, 0),
            year=2011,
            venue_address="Connecticut Convention Center\r\n100 Columbus Blvd\r\nHartford, CT 06103\r\nUSA",
            website="http://www.ctfirst.org/ctr"
        )
        event.put()

        team = Team(
            id="frc177",
            team_number=177,
            website="http://www.bobcatrobotics.org"
        )
        team.put()

        event_team = EventTeam(
            id="%s_%s" % (event.key.id(), team.key.id()),
            event=event.key,
            team=team.key,
            year=None)
        event_team.put()
    def test_update_pastyear(self):
        teams, event_teams, et_keys_to_delete = EventTeamUpdater.update('{}tstupdaterpastyear'.format(CUR_YEAR - 1))
        self.assertEqual(set([team.team_number for team in teams]).symmetric_difference({95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017, 1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665, 4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467, 2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694, 571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718, 2170, 663, 4122, 3182, 839, 1784, 3654, 743}),
                         set())
        self.assertEqual(set([et.key_name for et in event_teams]).symmetric_difference({'{}tstupdaterpastyear_frc95'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc178'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc176'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1922'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc173'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2785'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc228'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc177'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1099'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc175'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1027'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3017'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1493'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc118'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc229'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2791'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc155'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc549'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc195'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4134'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc20'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2836'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc869'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1665'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4055'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3555'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc126'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1699'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1559'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3464'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2168'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3461'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1991'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3467'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2067'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc230'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1124'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3104'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc236'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc237'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1511'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc250'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1880'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc558'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc694'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc571'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3634'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3525'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc999'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc181'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1073'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3146'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1071'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1740'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3719'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3718'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2170'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc663'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4122'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3182'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc839'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1784'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3654'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc743'.format(CUR_YEAR - 1)}),
                         set())
        self.assertEqual(et_keys_to_delete, set())

        event_team = EventTeam(
            id="%s_%s" % ('{}tstupdaterpastyear'.format(CUR_YEAR - 1), 'frc9999'),
            event=ndb.Key(Event, '{}tstupdaterpastyear'.format(CUR_YEAR - 1)),
            team=ndb.Key(Team, 'frc9999'),
            year=CUR_YEAR - 1)
        event_team.put()

        teams, event_teams, et_keys_to_delete = EventTeamUpdater.update('{}tstupdaterpastyear'.format(CUR_YEAR - 1))
        self.assertEqual(set([team.team_number for team in teams]).symmetric_difference({95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017, 1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665, 4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467, 2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694, 571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718, 2170, 663, 4122, 3182, 839, 1784, 3654, 743}),
                         set())
        self.assertEqual(set([et.key_name for et in event_teams]).symmetric_difference({'{}tstupdaterpastyear_frc95'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc178'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc176'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1922'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc173'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2785'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc228'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc177'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1099'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc175'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1027'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3017'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1493'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc118'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc229'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2791'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc155'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc549'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc195'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4134'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc20'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2836'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc869'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1665'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4055'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3555'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc126'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1699'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1559'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3464'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2168'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3461'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1991'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3467'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2067'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc230'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1124'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3104'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc236'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc237'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1511'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc250'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1880'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc558'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc694'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc571'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3634'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3525'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc999'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc181'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1073'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3146'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1071'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1740'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3719'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3718'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc2170'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc663'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc4122'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3182'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc839'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc1784'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc3654'.format(CUR_YEAR - 1), '{}tstupdaterpastyear_frc743'.format(CUR_YEAR - 1)}),
                         set())
        self.assertEqual(et_keys_to_delete, set())
    def test_update_future(self):
        if os.environ.get('TRAVIS', '') != 'true':
            # Flaky on Travis -gregmarra 20130921
            teams, event_teams, et_keys_to_delete = EventTeamUpdater.update('2011tstupdaterfuture')
            self.assertEqual(set([team.team_number for team in teams]).symmetric_difference({95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017, 1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665, 4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467, 2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694, 571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718, 2170, 663, 4122, 3182, 839, 1784, 3654, 743}),
                             set())
            self.assertEqual(set([et.key_name for et in event_teams]).symmetric_difference({'2011tstupdaterfuture_frc95', '2011tstupdaterfuture_frc178', '2011tstupdaterfuture_frc176', '2011tstupdaterfuture_frc1922', '2011tstupdaterfuture_frc173', '2011tstupdaterfuture_frc2785', '2011tstupdaterfuture_frc228', '2011tstupdaterfuture_frc177', '2011tstupdaterfuture_frc1099', '2011tstupdaterfuture_frc175', '2011tstupdaterfuture_frc1027', '2011tstupdaterfuture_frc3017', '2011tstupdaterfuture_frc1493', '2011tstupdaterfuture_frc118', '2011tstupdaterfuture_frc229', '2011tstupdaterfuture_frc2791', '2011tstupdaterfuture_frc155', '2011tstupdaterfuture_frc549', '2011tstupdaterfuture_frc195', '2011tstupdaterfuture_frc4134', '2011tstupdaterfuture_frc20', '2011tstupdaterfuture_frc2836', '2011tstupdaterfuture_frc869', '2011tstupdaterfuture_frc1665', '2011tstupdaterfuture_frc4055', '2011tstupdaterfuture_frc3555', '2011tstupdaterfuture_frc126', '2011tstupdaterfuture_frc1699', '2011tstupdaterfuture_frc1559', '2011tstupdaterfuture_frc3464', '2011tstupdaterfuture_frc2168', '2011tstupdaterfuture_frc3461', '2011tstupdaterfuture_frc1991', '2011tstupdaterfuture_frc3467', '2011tstupdaterfuture_frc2067', '2011tstupdaterfuture_frc230', '2011tstupdaterfuture_frc1124', '2011tstupdaterfuture_frc3104', '2011tstupdaterfuture_frc236', '2011tstupdaterfuture_frc237', '2011tstupdaterfuture_frc1511', '2011tstupdaterfuture_frc250', '2011tstupdaterfuture_frc1880', '2011tstupdaterfuture_frc558', '2011tstupdaterfuture_frc694', '2011tstupdaterfuture_frc571', '2011tstupdaterfuture_frc3634', '2011tstupdaterfuture_frc3525', '2011tstupdaterfuture_frc999', '2011tstupdaterfuture_frc181', '2011tstupdaterfuture_frc1073', '2011tstupdaterfuture_frc3146', '2011tstupdaterfuture_frc1071', '2011tstupdaterfuture_frc1740', '2011tstupdaterfuture_frc3719', '2011tstupdaterfuture_frc3718', '2011tstupdaterfuture_frc2170', '2011tstupdaterfuture_frc663', '2011tstupdaterfuture_frc4122', '2011tstupdaterfuture_frc3182', '2011tstupdaterfuture_frc839', '2011tstupdaterfuture_frc1784', '2011tstupdaterfuture_frc3654', '2011tstupdaterfuture_frc743'}),
                             set())
            self.assertEqual(et_keys_to_delete, set())

            event_team = EventTeam(
                id="%s_%s" % ('2011tstupdaterfuture', 'frc9999'),
                event=ndb.Key(Event, '2011tstupdaterfuture'),
                team=ndb.Key(Team, 'frc9999'),
                year=2011)
            event_team.put()

            teams, event_teams, et_keys_to_delete = EventTeamUpdater.update('2011tstupdaterfuture')
            self.assertEqual(set([team.team_number for team in teams]).symmetric_difference({95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017, 1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665, 4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467, 2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694, 571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718, 2170, 663, 4122, 3182, 839, 1784, 3654, 743}),
                             set())
            self.assertEqual(set([et.key_name for et in event_teams]).symmetric_difference({'2011tstupdaterfuture_frc95', '2011tstupdaterfuture_frc178', '2011tstupdaterfuture_frc176', '2011tstupdaterfuture_frc1922', '2011tstupdaterfuture_frc173', '2011tstupdaterfuture_frc2785', '2011tstupdaterfuture_frc228', '2011tstupdaterfuture_frc177', '2011tstupdaterfuture_frc1099', '2011tstupdaterfuture_frc175', '2011tstupdaterfuture_frc1027', '2011tstupdaterfuture_frc3017', '2011tstupdaterfuture_frc1493', '2011tstupdaterfuture_frc118', '2011tstupdaterfuture_frc229', '2011tstupdaterfuture_frc2791', '2011tstupdaterfuture_frc155', '2011tstupdaterfuture_frc549', '2011tstupdaterfuture_frc195', '2011tstupdaterfuture_frc4134', '2011tstupdaterfuture_frc20', '2011tstupdaterfuture_frc2836', '2011tstupdaterfuture_frc869', '2011tstupdaterfuture_frc1665', '2011tstupdaterfuture_frc4055', '2011tstupdaterfuture_frc3555', '2011tstupdaterfuture_frc126', '2011tstupdaterfuture_frc1699', '2011tstupdaterfuture_frc1559', '2011tstupdaterfuture_frc3464', '2011tstupdaterfuture_frc2168', '2011tstupdaterfuture_frc3461', '2011tstupdaterfuture_frc1991', '2011tstupdaterfuture_frc3467', '2011tstupdaterfuture_frc2067', '2011tstupdaterfuture_frc230', '2011tstupdaterfuture_frc1124', '2011tstupdaterfuture_frc3104', '2011tstupdaterfuture_frc236', '2011tstupdaterfuture_frc237', '2011tstupdaterfuture_frc1511', '2011tstupdaterfuture_frc250', '2011tstupdaterfuture_frc1880', '2011tstupdaterfuture_frc558', '2011tstupdaterfuture_frc694', '2011tstupdaterfuture_frc571', '2011tstupdaterfuture_frc3634', '2011tstupdaterfuture_frc3525', '2011tstupdaterfuture_frc999', '2011tstupdaterfuture_frc181', '2011tstupdaterfuture_frc1073', '2011tstupdaterfuture_frc3146', '2011tstupdaterfuture_frc1071', '2011tstupdaterfuture_frc1740', '2011tstupdaterfuture_frc3719', '2011tstupdaterfuture_frc3718', '2011tstupdaterfuture_frc2170', '2011tstupdaterfuture_frc663', '2011tstupdaterfuture_frc4122', '2011tstupdaterfuture_frc3182', '2011tstupdaterfuture_frc839', '2011tstupdaterfuture_frc1784', '2011tstupdaterfuture_frc3654', '2011tstupdaterfuture_frc743'}),
                             set())
            self.assertEqual(set([et_key.id() for et_key in et_keys_to_delete]),
                             set())
class TestDatabaseCacheClearer(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache()  # Prevent data from leaking between tests

        self.testbed.init_taskqueue_stub(root_path=".")

        self.eventteam_2015casj_frc254 = EventTeam(
            id='2015casj_frc254',
            event=ndb.Key(Event, '2015casj'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.eventteam_2015cama_frc604 = EventTeam(
            id='2015cama_frc604',
            event=ndb.Key(Event, '2015cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.eventteam_2010cama_frc604 = EventTeam(
            id='2010cama_frc604',
            event=ndb.Key(Event, '2010cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2010,
        )

        self.eventteam_2016necmp_frc125 = EventTeam(
            id='2016necmp_frc125',
            event=ndb.Key(Event, '2016necmp'),
            team=ndb.Key(Team, 'frc125'),
            year=2016,
        )

        self.eventteam_2015casj_frc254.put()
        self.eventteam_2015cama_frc604.put()
        self.eventteam_2010cama_frc604.put()
        self.eventteam_2016necmp_frc125.put()

        self.districtteam_2015fim_frc254 = DistrictTeam(
            id='2015fim_frc254',
            district_key=ndb.Key(District, '2015fim'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.districtteam_2015mar_frc604 = DistrictTeam(
            id='2015mar_frc604',
            district_key=ndb.Key(District, '2015mar'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.districtteam_2016ne_frc604 = DistrictTeam(
            id='2016ne_frc604',
            district_key=ndb.Key(District, '2016ne'),
            team=ndb.Key(Team, 'frc604'),
            year=2016,
        )

        self.districtteam_2015fim_frc254.put()
        self.districtteam_2015mar_frc604.put()
        self.districtteam_2016ne_frc604.put()

        self.district_2015ne = District(
            id='2015ne',
            year=2015,
            abbreviation='ne',
        )

        self.district_2016chs = District(
            id='2016chs',
            year=2016,
            abbreviation='chs',
        )
        self.district_2015ne.put()
        self.district_2016chs.put()

        self.event_2016necmp = Event(
            id='2016necmp',
            year=2016,
            district_key=ndb.Key(District, '2016ne'),
            event_short='necmp',
            event_type_enum=EventType.DISTRICT_CMP,
        )
        self.event_2016necmp.put()

    def tearDown(self):
        self.testbed.deactivate()

    def test_award_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.award_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys)

    def test_event_updated(self):
        affected_refs = {
            'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'year': {2014, 2015},
            'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2014mar')}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.event_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(EventQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventListQuery(2014).cache_key in cache_keys)
        self.assertTrue(EventListQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)

    def test_event_details_updated(self):
        affected_refs = {
            'key': {ndb.Key(EventDetails, '2015casj'), ndb.Key(EventDetails, '2015cama')},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.event_details_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(EventDetailsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventDetailsQuery('2015cama').cache_key in cache_keys)

    def test_match_updated(self):
        affected_refs = {
            'key': {ndb.Key(Match, '2015casj_qm1'), ndb.Key(Match, '2015casj_qm2')},
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.match_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(MatchQuery('2015casj_qm1').cache_key in cache_keys)
        self.assertTrue(MatchQuery('2015casj_qm2').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys)

    def test_media_updated_team(self):
        affected_refs = {
            'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_media_updated_event(self):
        affected_refs = {
            'references': {ndb.Key(Event, '2016necmp')},
            'year': {2016},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 1)
        self.assertTrue(EventMediasQuery('2016necmp').cache_key in cache_keys)

    def test_robot_updated(self):
        affected_refs = {
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.robot_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys)

    def test_team_updated(self):
        affected_refs = {
            'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.team_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 13)
        self.assertTrue(TeamQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamListQuery(0).cache_key in cache_keys)
        self.assertTrue(TeamListQuery(1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys)

    def test_eventteam_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 18)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamParticipationQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamParticipationQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_districtteam_updated(self):
        affected_refs = {
            'district_key': {ndb.Key(District, '2015fim'), ndb.Key(District, '2015mar')},
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 4)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)

    def test_district_updated(self):
        affected_refs = {
            'key': {ndb.Key(District, '2016ne')},
            'year': {2015, 2016},
            'abbreviation': {'ne', 'chs'}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.district_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 11)
        self.assertTrue(DistrictsInYearQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictsInYearQuery(2016).cache_key in cache_keys)
        self.assertTrue(DistrictHistoryQuery('ne').cache_key in cache_keys)
        self.assertTrue(DistrictHistoryQuery('chs').cache_key in cache_keys)
        self.assertTrue(DistrictQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)

        # Necessary because APIv3 Event models include the District model
        self.assertTrue(EventQuery('2016necmp').cache_key in cache_keys)
        self.assertTrue(EventListQuery(2016).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc125').cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc125', 2016).cache_key in cache_keys)
class TestApiTeamShow(unittest2.TestCase):

    # TODO: Add event_keys testing. -brandondean 10/21/2012
    def setUp(self):
        app = webapp2.WSGIApplication([(r'/', ApiTeamsShow)], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub()

        self.team = Team(
                id="frc281",
                name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number=281,
                nickname="EnTech GreenVillians",
                address="Greenville, SC, USA",
                website="www.entech.org",
        )

        self.team.put()

        self.event = Event(
                id="2010sc",
                name="Palmetto Regional",
                event_type_enum=EventType.REGIONAL,
                short_name="Palmetto",
                event_short="sc",
                year=2010,
                end_date=datetime(2010, 03, 27),
                official=True,
                location='Clemson, SC',
                start_date=datetime(2010, 03, 24),
        )

        self.event.put()

        self.event_team = EventTeam(
                team=self.team.key,
                event=self.event.key,
                year=datetime.now().year
        )

        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team_dict):
        self.assertEqual(team_dict["key"], self.team.key_name)
        self.assertEqual(team_dict["team_number"], self.team.team_number)
        self.assertEqual(team_dict["nickname"], self.team.nickname)
        self.assertEqual(team_dict["location"], self.team.location)
        self.assertEqual(team_dict["locality"], "Greenville")
        self.assertEqual(team_dict["country_name"], "USA")
        self.assertEqual(team_dict["region"], "SC")
        self.assertEqual(team_dict["website"], self.team.website)
        self.assertTrue(self.event.key.id() in team_dict["events"])

    def testTeamShow(self):
        response = self.testapp.get('/?teams=frc281', headers={"User-Agent": "tests"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict[0])

    def testNonexistentTeam(self):
        response = self.testapp.get('/?teams=frc3141579265', headers={"User-Agent": "tests"}, status=404)

        self.assertEqual(response.status_int, 404)

    def test_validate_user_agent(self):
        response = self.testapp.get('/?teams=frc254', expect_errors=True)  # By default get() doesn't send a user agent
        self.assertEqual(response.status, "400 Bad Request")
        self.assertEqual(response.body, '{"Error": "User-Agent is a required header."}')
class TestTeamApiController(unittest2.TestCase):

    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>', ApiTeamController, methods=['GET'])], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub()

        self.team = Team(
                id="frc281",
                name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number=281,
                nickname="EnTech GreenVillians",
                address="Greenville, SC, USA",
                website="www.entech.org",
        )

        self.team.put()

        self.event = Event(
                id="2010sc",
                name="Palmetto Regional",
                event_type_enum=EventType.REGIONAL,
                short_name="Palmetto",
                event_short="sc",
                year=datetime.now().year,
                end_date=datetime(2010, 03, 27),
                official=True,
                location='Clemson, SC',
                start_date=datetime(2010, 03, 24),
        )

        self.event.put()

        self.event_team = EventTeam(
                team=self.team.key,
                event=self.event.key,
                year=datetime.now().year
        )
        self.event_team.put()

        self.match = Match(
            id="2010sc_qm1",
            alliances_json="""{"blue": {"score": 57, "teams": ["frc3464", "frc20", "frc1073"]}, "red": {"score": 74, "teams": ["frc281", "frc571", "frc176"]}}""",
            comp_level="qm",
            event=self.event.key,
            game="frc_2012_rebr",
            set_number=1,
            match_number=1,
            team_key_names=[u'frc281', u'frc571', u'frc176', u'frc3464', u'frc20', u'frc1073'],

        )
        self.match.put()

        self.award = Award(
            name_str = "Engineering Inspiration",
            award_type_enum = AwardType.ENGINEERING_INSPIRATION,
            year=datetime.now().year,
            event = self.event.key,
            event_type_enum = EventType.REGIONAL,
            team_list = [self.team.key],
            recipient_json_list=[json.dumps({'team_number': 281, 'awardee': None})],
        )
        self.award.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team):
        self.assertEqual(team["key"], self.team.key_name)
        self.assertEqual(team["team_number"], self.team.team_number)
        self.assertEqual(team["nickname"], self.team.nickname)
        self.assertEqual(team["location"], self.team.location)
        self.assertEqual(team["locality"], "Greenville")
        self.assertEqual(team["country_name"], "USA")
        self.assertEqual(team["region"], "SC")
        self.assertEqual(team["website"], self.team.website)

    def assertEventJson(self, event):
        self.assertEqual(event["key"], self.event.key_name)
        self.assertEqual(event["name"], self.event.name)
        self.assertEqual(event["short_name"], self.event.short_name)
        self.assertEqual(event["official"], self.event.official)
        self.assertEqual(event["start_date"], self.event.start_date.date().isoformat())
        self.assertEqual(event["end_date"], self.event.end_date.date().isoformat())
        self.assertEqual(event["event_type_string"], self.event.event_type_str)
        self.assertEqual(event["event_type"], self.event.event_type_enum)

    def assertMatchJson(self, match):
        self.assertEqual(str(match["key"]), self.match.key.string_id())
        self.assertEqual(match["comp_level"], self.match.comp_level)
        self.assertEqual(match["event_key"], self.match.event.string_id())
        self.assertEqual(match["set_number"], self.match.set_number)
        self.assertEqual(match["match_number"], self.match.match_number)

    def assertAwardJson(self, award):
        self.assertEqual(award["name"], self.award.name_str)
        self.assertEqual(award["event_key"], self.award.event.string_id())
        self.assertEqual(award["recipient_list"], self.award.recipient_list)
        self.assertEqual(award["year"], self.award.year)

    def testTeamApi(self):
        response = self.testapp.get('/frc281', headers={"X-TBA-App-Id": "tba-tests:team-controller-test:v01"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict)
        self.assertEventJson(team_dict["events"][0])
        self.assertMatchJson(team_dict["events"][0]["matches"][0])
        self.assertAwardJson(team_dict["events"][0]["awards"][0])
class TestApiTeamShow(unittest2.TestCase):

    #TODO: Add event_keys testing. -brandondean 10/21/2012
    def setUp(self):
        app = webapp2.WSGIApplication([(r'/', ApiTeamsShow)], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()

        self.team = Team(
                id = "frc281",
                name = "Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number = 281,
                nickname = "EnTech GreenVillians",
                address = "Greenville, SC, USA",
                website = "www.entech.org",
        )

        self.team.put()

        self.event = Event(
                id = "2010sc",
                name = "Palmetto Regional",
                event_type = "Regional",
                short_name = "Palmetto",
                event_short = "sc",
                year = 2010,
                end_date = datetime(2010, 03, 27),
                official = True,
                location = 'Clemson, SC',
                start_date = datetime(2010, 03, 24),
        )

        self.event.put()

        self.event_team = EventTeam(
                team = self.team.key,
                event = self.event.key,
                year = datetime.now().year
        )

        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team_dict):
        self.assertEqual(team_dict["key"], self.team.key_name)
        self.assertEqual(team_dict["team_number"], self.team.team_number)
        self.assertEqual(team_dict["nickname"], self.team.nickname)
        self.assertEqual(team_dict["location"], self.team.address)
        self.assertEqual(team_dict["locality"], "Greenville")
        self.assertEqual(team_dict["country_name"], "USA")
        self.assertEqual(team_dict["region"], "SC")
        self.assertEqual(team_dict["website"], self.team.website)
        self.assertEqual(team_dict["events"][0], self.event.key_name)

    def testTeamShow(self):
        response = self.testapp.get('/?teams=frc281')

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict[0])
class TestTeamEventsApiController(unittest2.TestCase):

    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>/<year:>', ApiTeamEventsController, methods=['GET'])], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub(root_path=".")

        self.team = Team(
                id="frc281",
                name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number=281,
                nickname="EnTech GreenVillians",
                address="Greenville, SC, USA",
                website="www.entech.org",
        )
        self.team.put()

        self.event = Event(
                id="2010sc",
                name="Palmetto Regional",
                event_type_enum=EventType.REGIONAL,
                short_name="Palmetto",
                event_short="sc",
                year=datetime.now().year,
                end_date=datetime(2010, 03, 27),
                official=True,
                location='Clemson, SC',
                start_date=datetime(2010, 03, 24),
        )
        self.event.put()

        self.event_team = EventTeam(
                team=self.team.key,
                event=self.event.key,
                year=2010
        )
        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertEventJson(self, event):
        self.assertEqual(event["key"], self.event.key_name)
        self.assertEqual(event["name"], self.event.name)
        self.assertEqual(event["short_name"], self.event.short_name)
        self.assertEqual(event["official"], self.event.official)
        self.assertEqual(event["start_date"], self.event.start_date.date().isoformat())
        self.assertEqual(event["end_date"], self.event.end_date.date().isoformat())
        self.assertEqual(event["event_type_string"], self.event.event_type_str)
        self.assertEqual(event["event_type"], self.event.event_type_enum)

    def testTeamApi(self):
        response = self.testapp.get('/frc281/2010', headers={"X-TBA-App-Id": "tba-tests:team-controller-test:v01"})

        event_dict = json.loads(response.body)
        self.assertEventJson(event_dict[0])
Beispiel #9
0
class TestDatabaseCacheClearer(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub(root_path=".")

        self.eventteam_2015casj_frc254 = EventTeam(
            id='2015casj_frc254',
            event=ndb.Key(Event, '2015casj'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.eventteam_2015cama_frc604 = EventTeam(
            id='2015cama_frc604',
            event=ndb.Key(Event, '2015cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.eventteam_2015casj_frc254.put()
        self.eventteam_2015cama_frc604.put()

        self.districtteam_2015fim_frc254 = DistrictTeam(
            id='2015fim_frc254',
            district=DistrictType.MICHIGAN,
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.districtteam_2015mar_frc604 = DistrictTeam(
            id='2015mar_frc604',
            district=DistrictType.MID_ATLANTIC,
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.districtteam_2015fim_frc254.put()
        self.districtteam_2015mar_frc604.put()

    def tearDown(self):
        self.testbed.deactivate()

    def test_award_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team_list': {ndb.Key(Team, 'frc254'),
                          ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.award_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys)

    def test_event_updated(self):
        affected_refs = {
            'key': {ndb.Key(Event, '2015casj'),
                    ndb.Key(Event, '2015cama')},
            'year': {2014, 2015},
            'event_district_key': {'2015fim', '2014mar'}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.event_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 8)
        self.assertTrue(EventListQuery(2014).cache_key in cache_keys)
        self.assertTrue(EventListQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)

    def test_match_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team_keys': {ndb.Key(Team, 'frc254'),
                          ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.match_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc254', '2015casj').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc254', '2015cama').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc604', '2015casj').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc604', '2015cama').cache_key in
            cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys)

    def test_media_updated(self):
        affected_refs = {
            'references': {ndb.Key(Team, 'frc254'),
                           ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.media_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 4)
        self.assertTrue(
            TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys)

    def test_robot_updated(self):
        affected_refs = {
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.robot_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys)

    def test_team_updated(self):
        affected_refs = {
            'key': {ndb.Key(Team, 'frc254'),
                    ndb.Key(Team, 'frc604')},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.team_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 8)
        self.assertTrue(TeamListQuery(0).cache_key in cache_keys)
        self.assertTrue(TeamListQuery(1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)

    def test_eventteam_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.eventteam_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 14)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamParticipationQuery('frc254').cache_key in cache_keys)
        self.assertTrue(
            TeamParticipationQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)

    def test_districtteam_updated(self):
        affected_refs = {
            'district_key': {'2015fim', '2015mar'},
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.districtteam_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 4)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)
Beispiel #10
0
class TestEventTeamsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([
            webapp2.Route(
                r'/<event_key:>', ApiEventTeamsController, methods=['GET'])
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub()

        self.event = Event(
            id="2010sc",
            name="Palmetto Regional",
            event_type_enum=EventType.REGIONAL,
            short_name="Palmetto",
            event_short="sc",
            year=2010,
            end_date=datetime(2010, 03, 27),
            official=True,
            location='Clemson, SC',
            start_date=datetime(2010, 03, 24),
        )
        self.event.put()

        self.team = Team(
            id="frc281",
            name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
            team_number=281,
            nickname="EnTech GreenVillians",
            address="Greenville, SC, USA",
            website="www.entech.org",
        )
        self.team.put()

        self.event_team = EventTeam(team=self.team.key,
                                    event=self.event.key,
                                    year=datetime.now().year)
        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team):
        team = team[0]
        self.assertEqual(team["key"], self.team.key_name)
        self.assertEqual(team["team_number"], self.team.team_number)
        self.assertEqual(team["nickname"], self.team.nickname)
        self.assertEqual(team["location"], self.team.location)
        self.assertEqual(team["locality"], "Greenville")
        self.assertEqual(team["country_name"], "USA")
        self.assertEqual(team["region"], "SC")
        self.assertEqual(team["website"], self.team.website)

    def testEventTeamsApi(self):
        response = self.testapp.get(
            '/2010sc',
            headers={"X-TBA-App-Id": "tba-tests:event-controller-test:v01"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict)
Beispiel #11
0
class TestTeamApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([
            webapp2.Route(r'/<team_key:>', ApiTeamController, methods=['GET'])
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub()

        self.team = Team(
            id="frc281",
            name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
            team_number=281,
            nickname="EnTech GreenVillians",
            address="Greenville, SC, USA",
            website="www.entech.org",
        )

        self.team.put()

        self.event = Event(
            id="2010sc",
            name="Palmetto Regional",
            event_type_enum=EventType.REGIONAL,
            short_name="Palmetto",
            event_short="sc",
            year=datetime.now().year,
            end_date=datetime(2010, 03, 27),
            official=True,
            location='Clemson, SC',
            start_date=datetime(2010, 03, 24),
        )

        self.event.put()

        self.event_team = EventTeam(team=self.team.key,
                                    event=self.event.key,
                                    year=datetime.now().year)
        self.event_team.put()

        self.match = Match(
            id="2010sc_qm1",
            alliances_json=
            """{"blue": {"score": 57, "teams": ["frc3464", "frc20", "frc1073"]}, "red": {"score": 74, "teams": ["frc281", "frc571", "frc176"]}}""",
            comp_level="qm",
            event=self.event.key,
            game="frc_2012_rebr",
            set_number=1,
            match_number=1,
            team_key_names=[
                u'frc281', u'frc571', u'frc176', u'frc3464', u'frc20',
                u'frc1073'
            ],
        )
        self.match.put()

        self.award = Award(
            name_str="Engineering Inspiration",
            award_type_enum=AwardType.ENGINEERING_INSPIRATION,
            year=datetime.now().year,
            event=self.event.key,
            event_type_enum=EventType.REGIONAL,
            team_list=[self.team.key],
            recipient_json_list=[
                json.dumps({
                    'team_number': 281,
                    'awardee': None
                })
            ],
        )
        self.award.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team):
        self.assertEqual(team["key"], self.team.key_name)
        self.assertEqual(team["team_number"], self.team.team_number)
        self.assertEqual(team["nickname"], self.team.nickname)
        self.assertEqual(team["location"], self.team.location)
        self.assertEqual(team["locality"], "Greenville")
        self.assertEqual(team["country_name"], "USA")
        self.assertEqual(team["region"], "SC")
        self.assertEqual(team["website"], self.team.website)

    def assertEventJson(self, event):
        self.assertEqual(event["key"], self.event.key_name)
        self.assertEqual(event["name"], self.event.name)
        self.assertEqual(event["short_name"], self.event.short_name)
        self.assertEqual(event["official"], self.event.official)
        self.assertEqual(event["start_date"],
                         self.event.start_date.isoformat())
        self.assertEqual(event["end_date"], self.event.end_date.isoformat())
        self.assertEqual(event["event_type_string"], self.event.event_type_str)
        self.assertEqual(event["event_type"], self.event.event_type_enum)

    def assertMatchJson(self, match):
        self.assertEqual(str(match["key"]), self.match.key.string_id())
        self.assertEqual(match["comp_level"], self.match.comp_level)
        self.assertEqual(match["event_key"], self.match.event.string_id())
        self.assertEqual(match["set_number"], self.match.set_number)
        self.assertEqual(match["match_number"], self.match.match_number)

    def assertAwardJson(self, award):
        self.assertEqual(award["name"], self.award.name_str)
        self.assertEqual(award["event_key"], self.award.event.string_id())
        self.assertEqual(award["recipient_list"], self.award.recipient_list)
        self.assertEqual(award["year"], self.award.year)

    def testTeamApi(self):
        response = self.testapp.get(
            '/frc281',
            headers={"X-TBA-App-Id": "tba-tests:team-controller-test:v01"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict)
        self.assertEventJson(team_dict["events"][0])
        self.assertMatchJson(team_dict["events"][0]["matches"][0])
        self.assertAwardJson(team_dict["events"][0]["awards"][0])
class TestTeamEventsApiController(unittest2.TestCase):

    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>/<year:>', ApiTeamEventsController, methods=['GET'])], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache()  # Prevent data from leaking between tests

        self.testbed.init_taskqueue_stub(root_path=".")

        self.team = Team(
                id="frc281",
                name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number=281,
                nickname="EnTech GreenVillians",
                city="Greenville",
                state_prov="SC",
                country="USA",
                website="www.entech.org",
        )
        self.team.put()

        self.event = Event(
                id="2010sc",
                name="Palmetto Regional",
                event_type_enum=EventType.REGIONAL,
                short_name="Palmetto",
                event_short="sc",
                year=datetime.now().year,
                end_date=datetime(2010, 03, 27),
                official=True,
                city='Clemson',
                state_prov='SC',
                country='USA',
                start_date=datetime(2010, 03, 24),
        )
        self.event.put()

        self.event_team = EventTeam(
                team=self.team.key,
                event=self.event.key,
                year=2010
        )
        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertEventJson(self, event):
        self.assertEqual(event["key"], self.event.key_name)
        self.assertEqual(event["name"], self.event.name)
        self.assertEqual(event["short_name"], self.event.short_name)
        self.assertEqual(event["official"], self.event.official)
        self.assertEqual(event["start_date"], self.event.start_date.date().isoformat())
        self.assertEqual(event["end_date"], self.event.end_date.date().isoformat())
        self.assertEqual(event["event_type_string"], self.event.event_type_str)
        self.assertEqual(event["event_type"], self.event.event_type_enum)

    def testTeamApi(self):
        response = self.testapp.get('/frc281/2010', headers={"X-TBA-App-Id": "tba-tests:team-controller-test:v01"})

        event_dict = json.loads(response.body)
        self.assertEventJson(event_dict[0])
class TestTeamController(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(r'/team/<team_number:[0-9]+>', TeamCanonical,
                          'team-canonical'),
            RedirectRoute(r'/team/<team_number:[0-9]+>/<year:[0-9]+>',
                          TeamDetail, 'team-detail'),
            RedirectRoute(r'/team/<team_number:[0-9]+>/history', TeamHistory,
                          'team-history'),
            RedirectRoute(r'/teams/<page:[0-9]+>', TeamList, 'team-list-year'),
            RedirectRoute(r'/teams', TeamList, 'team-list'),
        ])
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            name="Really Long Name",
            team_number=1124,
            rookie_year=2003,
            nickname="The UberBots",
            city="Avon",
            state_prov="CT",
            country="USA",
            website="www.uberbots.org",
            motto="This is a motto",
        )
        self.event = Event(
            id="2016necmp",
            name="New England District Championship",
            event_type_enum=EventType.DISTRICT_CMP,
            short_name="New England",
            event_short="necmp",
            year=2016,
            end_date=datetime(2016, 03, 27),
            official=True,
            city='Hartford',
            state_prov='CT',
            country='USA',
            venue="Some Venue",
            venue_address="Some Venue, Hartford, CT, USA",
            timezone_id="America/New_York",
            start_date=datetime(2016, 03, 24),
        )
        self.event_team = EventTeam(id="2016necmp_frc1124",
                                    team=self.team.key,
                                    event=self.event.key,
                                    year=2016)
        self.event2 = Event(
            id="2015necmp",
            name="New England District Championship",
            event_type_enum=EventType.DISTRICT_CMP,
            short_name="New England",
            event_short="necmp",
            year=2015,
            end_date=datetime(2015, 03, 27),
            official=True,
            city='Hartford',
            state_prov='CT',
            country='USA',
            venue="Some Venue",
            venue_address="Some Venue, Hartford, CT, USA",
            timezone_id="America/New_York",
            start_date=datetime(2015, 03, 24),
        )
        self.event_team2 = EventTeam(id="2015necmp_frc1124",
                                     team=self.team.key,
                                     event=self.event2.key,
                                     year=2015)
        self.event_team.put()
        self.team.put()
        self.event.put()
        self.event_team.put()
        self.event2.put()
        self.event_team2.put()

    def tearDown(self):
        self.testbed.deactivate()

    def testTeamListDefaultPage(self):
        response = self.testapp.get("/teams")
        self.assertEqual(response.status_int, 200)

    def testTeamListExplicitPage(self):
        response = self.testapp.get("/teams/1")
        self.assertEqual(response.status_int, 200)

    def testTeamListBadPage(self):
        response = self.testapp.get("/teams/19", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamCanonical(self):
        response = self.testapp.get("/team/1124")
        self.assertEqual(response.status_int, 200)

    def testBadTeamCanonical(self):
        response = self.testapp.get("/team/1337", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamDetail(self):
        response = self.testapp.get("/team/1124/2016")
        self.assertEqual(response.status_int, 200)

    # Because 2015 is special :/
    def testTeamDetail2015(self):
        response = self.testapp.get("/team/1124/2015")
        self.assertEqual(response.status_int, 200)

    def testTeamDetailBadYear(self):
        response = self.testapp.get("/team/1124/2014", status=404)
        self.assertEqual(response.status_int, 404)

    def testBadTeamDetail(self):
        response = self.testapp.get("/team/1337/2016", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamHistory(self):
        response = self.testapp.get("/team/1124/history")
        self.assertEqual(response.status_int, 200)

    def testBadTeamHistory(self):
        response = self.testapp.get("/team/1337/history", status=404)
        self.assertEqual(response.status_int, 404)
class TestTeamController(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        app = webapp2.WSGIApplication([
            RedirectRoute(r'/team/<team_number:[0-9]+>', TeamCanonical, 'team-canonical'),
            RedirectRoute(r'/team/<team_number:[0-9]+>/<year:[0-9]+>', TeamDetail, 'team-detail'),
            RedirectRoute(r'/team/<team_number:[0-9]+>/history', TeamHistory, 'team-history'),
            RedirectRoute(r'/teams/<page:[0-9]+>', TeamList, 'team-list-year'),
            RedirectRoute(r'/teams', TeamList, 'team-list'),
        ])
        self.testapp = webtest.TestApp(app)

        self.team = Team(
                id="frc1124",
                name="Really Long Name",
                team_number=1124,
                rookie_year=2003,
                nickname="The UberBots",
                city="Avon",
                state_prov="CT",
                country="USA",
                website="www.uberbots.org",
                motto="This is a motto",
        )
        self.event = Event(
                id="2016necmp",
                name="New England District Championship",
                event_type_enum=EventType.DISTRICT_CMP,
                short_name="New England",
                event_short="necmp",
                year=2016,
                end_date=datetime(2016, 03, 27),
                official=True,
                city='Hartford',
                state_prov='CT',
                country='USA',
                venue="Some Venue",
                venue_address="Some Venue, Hartford, CT, USA",
                timezone_id="America/New_York",
                start_date=datetime(2016, 03, 24),
        )
        self.event_team = EventTeam(
                id="2016necmp_frc1124",
                team=self.team.key,
                event=self.event.key,
                year=2016
        )
        self.event2 = Event(
                id="2015necmp",
                name="New England District Championship",
                event_type_enum=EventType.DISTRICT_CMP,
                short_name="New England",
                event_short="necmp",
                year=2015,
                end_date=datetime(2015, 03, 27),
                official=True,
                city='Hartford',
                state_prov='CT',
                country='USA',
                venue="Some Venue",
                venue_address="Some Venue, Hartford, CT, USA",
                timezone_id="America/New_York",
                start_date=datetime(2015, 03, 24),
        )
        self.event_team2 = EventTeam(
                id="2015necmp_frc1124",
                team=self.team.key,
                event=self.event2.key,
                year=2015
        )
        self.event_team.put()
        self.team.put()
        self.event.put()
        self.event_team.put()
        self.event2.put()
        self.event_team2.put()

    def tearDown(self):
        self.testbed.deactivate()

    def testTeamListDefaultPage(self):
        response = self.testapp.get("/teams")
        self.assertEqual(response.status_int, 200)

    def testTeamListExplicitPage(self):
        response = self.testapp.get("/teams/1")
        self.assertEqual(response.status_int, 200)

    def testTeamListBadPage(self):
        response = self.testapp.get("/teams/19", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamCanonical(self):
        response = self.testapp.get("/team/1124")
        self.assertEqual(response.status_int, 200)

    def testBadTeamCanonical(self):
        response = self.testapp.get("/team/1337", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamDetail(self):
        response = self.testapp.get("/team/1124/2016")
        self.assertEqual(response.status_int, 200)

    # Because 2015 is special :/
    def testTeamDetail2015(self):
        response = self.testapp.get("/team/1124/2015")
        self.assertEqual(response.status_int, 200)

    def testTeamDetailBadYear(self):
        response = self.testapp.get("/team/1124/2014", status=404)
        self.assertEqual(response.status_int, 404)

    def testBadTeamDetail(self):
        response = self.testapp.get("/team/1337/2016", status=404)
        self.assertEqual(response.status_int, 404)

    def testTeamHistory(self):
        response = self.testapp.get("/team/1124/history")
        self.assertEqual(response.status_int, 200)

    def testBadTeamHistory(self):
        response = self.testapp.get("/team/1337/history", status=404)
        self.assertEqual(response.status_int, 404)
    def test_update_future(self):
        teams, event_teams, et_keys_to_delete = EventTeamUpdater.update(
            '{}tstupdaterfuture'.format(CUR_YEAR))
        self.assertEqual(
            set([team.team_number for team in teams]).symmetric_difference({
                95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017,
                1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665,
                4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467,
                2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694,
                571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718,
                2170, 663, 4122, 3182, 839, 1784, 3654, 743
            }), set())
        self.assertEqual(
            set([et.key_name for et in event_teams]).symmetric_difference({
                '{}tstupdaterfuture_frc95'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc178'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc176'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1922'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc173'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2785'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc228'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc177'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1099'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc175'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1027'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3017'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1493'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc118'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc229'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2791'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc155'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc549'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc195'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4134'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc20'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2836'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc869'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1665'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4055'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3555'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc126'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1699'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1559'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3464'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2168'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3461'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1991'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3467'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2067'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc230'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1124'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3104'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc236'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc237'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1511'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc250'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1880'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc558'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc694'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc571'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3634'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3525'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc999'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc181'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1073'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3146'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1071'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1740'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3719'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3718'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2170'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc663'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4122'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3182'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc839'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1784'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3654'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc743'.format(CUR_YEAR)
            }), set())
        self.assertEqual(et_keys_to_delete, set())

        event_team = EventTeam(
            id="%s_%s" % ('{}tstupdaterfuture'.format(CUR_YEAR), 'frc9999'),
            event=ndb.Key(Event, '{}tstupdaterfuture'.format(CUR_YEAR)),
            team=ndb.Key(Team, 'frc9999'),
            year=CUR_YEAR)
        event_team.put()

        teams, event_teams, et_keys_to_delete = EventTeamUpdater.update(
            '{}tstupdaterfuture'.format(CUR_YEAR))
        self.assertEqual(
            set([team.team_number for team in teams]).symmetric_difference({
                95, 178, 176, 1922, 173, 2785, 228, 177, 1099, 175, 1027, 3017,
                1493, 118, 229, 2791, 155, 549, 195, 4134, 20, 2836, 869, 1665,
                4055, 3555, 126, 1699, 1559, 3464, 2168, 3461, 1991, 3467,
                2067, 230, 1124, 3104, 236, 237, 1511, 250, 1880, 558, 694,
                571, 3634, 3525, 999, 181, 1073, 3146, 1071, 1740, 3719, 3718,
                2170, 663, 4122, 3182, 839, 1784, 3654, 743
            }), set())
        self.assertEqual(
            set([et.key_name for et in event_teams]).symmetric_difference({
                '{}tstupdaterfuture_frc95'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc178'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc176'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1922'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc173'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2785'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc228'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc177'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1099'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc175'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1027'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3017'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1493'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc118'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc229'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2791'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc155'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc549'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc195'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4134'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc20'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2836'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc869'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1665'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4055'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3555'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc126'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1699'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1559'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3464'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2168'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3461'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1991'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3467'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2067'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc230'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1124'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3104'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc236'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc237'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1511'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc250'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1880'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc558'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc694'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc571'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3634'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3525'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc999'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc181'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1073'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3146'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1071'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1740'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3719'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3718'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc2170'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc663'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc4122'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3182'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc839'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc1784'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc3654'.format(CUR_YEAR),
                '{}tstupdaterfuture_frc743'.format(CUR_YEAR)
            }), set())
        self.assertEqual(set([et_key.id() for et_key in et_keys_to_delete]),
                         set())
class TestDatabaseCacheClearer(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub(root_path=".")

        self.eventteam_2015casj_frc254 = EventTeam(
            id='2015casj_frc254',
            event=ndb.Key(Event, '2015casj'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.eventteam_2015cama_frc604 = EventTeam(
            id='2015cama_frc604',
            event=ndb.Key(Event, '2015cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.eventteam_2010cama_frc604 = EventTeam(
            id='2010cama_frc604',
            event=ndb.Key(Event, '2010cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2010,
        )

        self.eventteam_2015casj_frc254.put()
        self.eventteam_2015cama_frc604.put()
        self.eventteam_2010cama_frc604.put()

        self.districtteam_2015fim_frc254 = DistrictTeam(
            id='2015fim_frc254',
            district=DistrictType.MICHIGAN,
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.districtteam_2015mar_frc604 = DistrictTeam(
            id='2015mar_frc604',
            district=DistrictType.MID_ATLANTIC,
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.districtteam_2015fim_frc254.put()
        self.districtteam_2015mar_frc604.put()

    def tearDown(self):
        self.testbed.deactivate()

    def test_award_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team_list': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.award_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys)

    def test_event_updated(self):
        affected_refs = {
            'key': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'year': {2014, 2015},
            'event_district_key': {'2015fim', '2014mar'}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.event_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 8)
        self.assertTrue(EventListQuery(2014).cache_key in cache_keys)
        self.assertTrue(EventListQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)

    def test_match_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team_keys': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.match_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(TeamEventMatchesQuery('frc604', '2015cama').cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys)

    def test_media_updated(self):
        affected_refs = {
            'references': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.media_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_robot_updated(self):
        affected_refs = {
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.robot_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys)

    def test_team_updated(self):
        affected_refs = {
            'key': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
        }
        cache_keys = [q.cache_key for q in get_affected_queries.team_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(TeamListQuery(0).cache_key in cache_keys)
        self.assertTrue(TeamListQuery(1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys)

    def test_eventteam_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'), ndb.Key(Event, '2015cama')},
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.eventteam_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 18)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamParticipationQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamParticipationQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_districtteam_updated(self):
        affected_refs = {
            'district_key': {'2015fim', '2015mar'},
            'team': {ndb.Key(Team, 'frc254'), ndb.Key(Team, 'frc604')}
        }
        cache_keys = [q.cache_key for q in get_affected_queries.districtteam_updated(affected_refs)]

        self.assertEqual(len(cache_keys), 4)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)
class TestDatabaseCacheClearer(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        self.testbed.init_taskqueue_stub(root_path=".")

        self.eventteam_2015casj_frc254 = EventTeam(
            id='2015casj_frc254',
            event=ndb.Key(Event, '2015casj'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.eventteam_2015cama_frc604 = EventTeam(
            id='2015cama_frc604',
            event=ndb.Key(Event, '2015cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.eventteam_2010cama_frc604 = EventTeam(
            id='2010cama_frc604',
            event=ndb.Key(Event, '2010cama'),
            team=ndb.Key(Team, 'frc604'),
            year=2010,
        )

        self.eventteam_2016necmp_frc125 = EventTeam(
            id='2016necmp_frc125',
            event=ndb.Key(Event, '2016necmp'),
            team=ndb.Key(Team, 'frc125'),
            year=2016,
        )

        self.eventteam_2015casj_frc254.put()
        self.eventteam_2015cama_frc604.put()
        self.eventteam_2010cama_frc604.put()
        self.eventteam_2016necmp_frc125.put()

        self.districtteam_2015fim_frc254 = DistrictTeam(
            id='2015fim_frc254',
            district_key=ndb.Key(District, '2015fim'),
            team=ndb.Key(Team, 'frc254'),
            year=2015,
        )

        self.districtteam_2015mar_frc604 = DistrictTeam(
            id='2015mar_frc604',
            district_key=ndb.Key(District, '2015mar'),
            team=ndb.Key(Team, 'frc604'),
            year=2015,
        )

        self.districtteam_2016ne_frc604 = DistrictTeam(
            id='2016ne_frc604',
            district_key=ndb.Key(District, '2016ne'),
            team=ndb.Key(Team, 'frc604'),
            year=2016,
        )

        self.districtteam_2015fim_frc254.put()
        self.districtteam_2015mar_frc604.put()
        self.districtteam_2016ne_frc604.put()

        self.district_2015ne = District(
            id='2015ne',
            year=2015,
            abbreviation='ne',
        )

        self.district_2016chs = District(
            id='2016chs',
            year=2016,
            abbreviation='chs',
        )
        self.district_2015ne.put()
        self.district_2016chs.put()

        self.event_2016necmp = Event(
            id='2016necmp',
            year=2016,
            district_key=ndb.Key(District, '2016ne'),
            event_short='necmp',
            event_type_enum=EventType.DISTRICT_CMP,
        )
        self.event_2016necmp.put()

    def tearDown(self):
        self.testbed.deactivate()

    def test_award_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team_list': {ndb.Key(Team, 'frc254'),
                          ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.award_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(EventAwardsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventAwardsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamAwardsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearAwardsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc254', '2015casj').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc254', '2015cama').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc604', '2015casj').cache_key in cache_keys)
        self.assertTrue(
            TeamEventAwardsQuery('frc604', '2015cama').cache_key in cache_keys)

    def test_event_updated(self):
        affected_refs = {
            'key': {ndb.Key(Event, '2015casj'),
                    ndb.Key(Event, '2015cama')},
            'year': {2014, 2015},
            'district_key':
            {ndb.Key(District, '2015fim'),
             ndb.Key(District, '2014mar')}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.event_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(EventQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventListQuery(2014).cache_key in cache_keys)
        self.assertTrue(EventListQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2014mar').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)

    def test_event_details_updated(self):
        affected_refs = {
            'key': {
                ndb.Key(EventDetails, '2015casj'),
                ndb.Key(EventDetails, '2015cama')
            },
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.event_details_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(EventDetailsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventDetailsQuery('2015cama').cache_key in cache_keys)

    def test_match_updated(self):
        affected_refs = {
            'key':
            {ndb.Key(Match, '2015casj_qm1'),
             ndb.Key(Match, '2015casj_qm2')},
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team_keys': {ndb.Key(Team, 'frc254'),
                          ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.match_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 12)
        self.assertTrue(MatchQuery('2015casj_qm1').cache_key in cache_keys)
        self.assertTrue(MatchQuery('2015casj_qm2').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventMatchesQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc254', '2015casj').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc254', '2015cama').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc604', '2015casj').cache_key in
            cache_keys)
        self.assertTrue(
            TeamEventMatchesQuery('frc604', '2015cama').cache_key in
            cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMatchesQuery('frc604', 2015).cache_key in cache_keys)

    def test_media_updated_team(self):
        affected_refs = {
            'references': {ndb.Key(Team, 'frc254'),
                           ndb.Key(Team, 'frc604')},
            'year': {2014, 2015},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.media_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 10)
        self.assertTrue(
            TeamYearMediaQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc254').cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearMediaQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamSocialMediaQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_media_updated_event(self):
        affected_refs = {
            'references': {ndb.Key(Event, '2016necmp')},
            'year': {2016},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.media_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 1)
        self.assertTrue(EventMediasQuery('2016necmp').cache_key in cache_keys)

    def test_robot_updated(self):
        affected_refs = {
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.robot_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 2)
        self.assertTrue(TeamRobotsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamRobotsQuery('frc604').cache_key in cache_keys)

    def test_team_updated(self):
        affected_refs = {
            'key': {ndb.Key(Team, 'frc254'),
                    ndb.Key(Team, 'frc604')},
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.team_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 13)
        self.assertTrue(TeamQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamQuery('frc604').cache_key in cache_keys)
        self.assertTrue(TeamListQuery(0).cache_key in cache_keys)
        self.assertTrue(TeamListQuery(1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2010, 1).cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2010cama').cache_key in cache_keys)

    def test_eventteam_updated(self):
        affected_refs = {
            'event': {ndb.Key(Event, '2015casj'),
                      ndb.Key(Event, '2015cama')},
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')},
            'year': {2014, 2015}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.eventteam_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 18)
        self.assertTrue(TeamEventsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamParticipationQuery('frc254').cache_key in cache_keys)
        self.assertTrue(
            TeamParticipationQuery('frc604').cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc254', 2015).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2014).cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc604', 2015).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2014, 1).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 0).cache_key in cache_keys)
        self.assertTrue(TeamListYearQuery(2015, 1).cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(EventTeamsQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsMediasQuery('2015casj').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsPreferredMediasQuery('2015cama').cache_key in cache_keys)
        self.assertTrue(
            EventTeamsPreferredMediasQuery('2015casj').cache_key in cache_keys)

    def test_districtteam_updated(self):
        affected_refs = {
            'district_key':
            {ndb.Key(District, '2015fim'),
             ndb.Key(District, '2015mar')},
            'team': {ndb.Key(Team, 'frc254'),
                     ndb.Key(Team, 'frc604')}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.districtteam_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 4)
        self.assertTrue(DistrictTeamsQuery('2015fim').cache_key in cache_keys)
        self.assertTrue(DistrictTeamsQuery('2015mar').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc254').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)

    def test_district_updated(self):
        affected_refs = {
            'key': {ndb.Key(District, '2016ne')},
            'year': {2015, 2016},
            'abbreviation': {'ne', 'chs'}
        }
        cache_keys = [
            q.cache_key
            for q in get_affected_queries.district_updated(affected_refs)
        ]

        self.assertEqual(len(cache_keys), 11)
        self.assertTrue(DistrictsInYearQuery(2015).cache_key in cache_keys)
        self.assertTrue(DistrictsInYearQuery(2016).cache_key in cache_keys)
        self.assertTrue(DistrictHistoryQuery('ne').cache_key in cache_keys)
        self.assertTrue(DistrictHistoryQuery('chs').cache_key in cache_keys)
        self.assertTrue(DistrictQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(TeamDistrictsQuery('frc604').cache_key in cache_keys)

        # Necessary because APIv3 Event models include the District model
        self.assertTrue(EventQuery('2016necmp').cache_key in cache_keys)
        self.assertTrue(EventListQuery(2016).cache_key in cache_keys)
        self.assertTrue(DistrictEventsQuery('2016ne').cache_key in cache_keys)
        self.assertTrue(TeamEventsQuery('frc125').cache_key in cache_keys)
        self.assertTrue(
            TeamYearEventsQuery('frc125', 2016).cache_key in cache_keys)
class TestEventTeamsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<event_key:>', ApiEventTeamsController, methods=['GET'])], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        ndb.get_context().clear_cache()  # Prevent data from leaking between tests

        self.testbed.init_taskqueue_stub(root_path=".")

        self.event = Event(
                id="2010sc",
                name="Palmetto Regional",
                event_type_enum=EventType.REGIONAL,
                short_name="Palmetto",
                event_short="sc",
                year=2010,
                end_date=datetime(2010, 03, 27),
                official=True,
                city="Clemson",
                state_prov="SC",
                country="USA",
                start_date=datetime(2010, 03, 24),
        )
        self.event.put()

        self.team = Team(
                id="frc281",
                name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
                team_number=281,
                nickname="EnTech GreenVillians",
                city="Greenville",
                state_prov="SC",
                country="USA",
                website="www.entech.org",
        )
        self.team.put()

        self.event_team = EventTeam(
                team=self.team.key,
                event=self.event.key,
                year=datetime.now().year
        )
        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team):
        team = team[0]
        self.assertEqual(team["key"], self.team.key_name)
        self.assertEqual(team["team_number"], self.team.team_number)
        self.assertEqual(team["nickname"], self.team.nickname)
        self.assertEqual(team["location"], self.team.location)
        self.assertEqual(team["locality"], "Greenville")
        self.assertEqual(team["country_name"], "USA")
        self.assertEqual(team["region"], "SC")
        self.assertEqual(team["website"], self.team.website)

    def testEventTeamsApi(self):
        response = self.testapp.get('/2010sc', headers={"X-TBA-App-Id": "tba-tests:event-controller-test:v01"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict)
class TestApiTeamShow(unittest2.TestCase):

    # TODO: Add event_keys testing. -brandondean 10/21/2012
    def setUp(self):
        app = webapp2.WSGIApplication([(r'/', ApiTeamsShow)], debug=True)
        self.testapp = webtest.TestApp(app)

        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_memcache_stub()
        self.testbed.init_taskqueue_stub()

        self.team = Team(
            id="frc281",
            name="Michelin / Caterpillar / Greenville Technical College /\
                jcpenney / Baldor / ASME / Gastroenterology Associates /\
                Laserflex South & Greenville County Schools & Greenville\
                Technical Charter High School",
            team_number=281,
            nickname="EnTech GreenVillians",
            address="Greenville, SC, USA",
            website="www.entech.org",
        )

        self.team.put()

        self.event = Event(
            id="2010sc",
            name="Palmetto Regional",
            event_type_enum=EventType.REGIONAL,
            short_name="Palmetto",
            event_short="sc",
            year=2010,
            end_date=datetime(2010, 03, 27),
            official=True,
            location='Clemson, SC',
            start_date=datetime(2010, 03, 24),
        )

        self.event.put()

        self.event_team = EventTeam(team=self.team.key,
                                    event=self.event.key,
                                    year=datetime.now().year)

        self.event_team.put()

    def tearDown(self):
        self.testbed.deactivate()

    def assertTeamJson(self, team_dict):
        self.assertEqual(team_dict["key"], self.team.key_name)
        self.assertEqual(team_dict["team_number"], self.team.team_number)
        self.assertEqual(team_dict["nickname"], self.team.nickname)
        self.assertEqual(team_dict["location"], self.team.location)
        self.assertEqual(team_dict["locality"], "Greenville")
        self.assertEqual(team_dict["country_name"], "USA")
        self.assertEqual(team_dict["region"], "SC")
        self.assertEqual(team_dict["website"], self.team.website)
        self.assertTrue(self.event.key.id() in team_dict["events"])

    def testTeamShow(self):
        response = self.testapp.get(
            '/?teams=frc281',
            headers={"X-TBA-App-Id": "tba-tests:team-api-test:v01"})

        team_dict = json.loads(response.body)
        self.assertTeamJson(team_dict[0])

    def testNonexistentTeam(self):
        response = self.testapp.get(
            '/?teams=frc3141579265',
            headers={"X-TBA-App-Id": "tba-tests:team-api-test:v01"},
            status=404)

        self.assertEqual(response.status_int, 404)

    def test_validate_tba_app_id(self):
        response = self.testapp.get(
            '/?teams=frc254',
            expect_errors=True)  # By default get() doesn't send a user agent
        self.assertEqual(response.status, "400 Bad Request")
        self.assertTrue('Error' in json.loads(response.body).keys())