Beispiel #1
0
def _upload_stats(team_name, stats):
    query = Team.all()
    query.filter('name =', team_name)
    result = query.fetch(1)

    if len(result) > 0:
        for team in result:
            team.year = Const.LAST_YEAR
            team.offense_passing = stats['offense']['pass']
            team.offense_rushing = stats['offense']['rush']
            team.offense_first_down = stats['offense']['first_down']
            team.defense_passing = stats['defense']['pass']
            team.defense_rushing = stats['defense']['rush']
            team.defense_first_down = stats['defense']['first_down']

            team.put()
    else:
        team = Team(name=team_name,
                    year=Const.LAST_YEAR,
                    offense_passing=stats['offense']['pass'],
                    offense_rushing=stats['offense']['rush'],
                    offense_first_down=stats['offense']['first_down'],
                    defense_passing=stats['defense']['pass'],
                    defense_rushing=stats['defense']['rush'],
                    defense_first_down=stats['defense']['first_down'])

        team.put()
Beispiel #2
0
    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()
Beispiel #3
0
def _upload_stats(team_name, stats):
    query = Team.all()
    query.filter('name =', team_name)
    result = query.fetch(1)

    if len(result) > 0:
        for team in result:
            team.year = Const.LAST_YEAR
            team.offense_passing = stats['offense']['pass']
            team.offense_rushing = stats['offense']['rush']
            team.offense_first_down = stats['offense']['first_down']
            team.defense_passing = stats['defense']['pass']
            team.defense_rushing = stats['defense']['rush']
            team.defense_first_down = stats['defense']['first_down']

            team.put()
    else:
        team = Team(name = team_name,
                    year = Const.LAST_YEAR,
                    offense_passing = stats['offense']['pass'],
                    offense_rushing = stats['offense']['rush'],
                    offense_first_down = stats['offense']['first_down'],
                    defense_passing = stats['defense']['pass'],
                    defense_rushing = stats['defense']['rush'],
                    defense_first_down = stats['defense']['first_down'])

        team.put()
Beispiel #4
0
class TestTeamMediaApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>/<year:>', ApiTeamMediaController, 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="frc254",
                name="very long name",
                team_number=254,
                nickname="Teh Chezy Pofs",
                address="Greenville, SC, USA"
        )
        self.team.put()

        self.cdmedia = Media(
                        key=ndb.Key('Media', 'cdphotothread_39894'),
                        details_json=u'{"image_partial": "fe3/fe38d320428adf4f51ac969efb3db32c_l.jpg"}',
                        foreign_key=u'39894',
                        media_type_enum=1,
                        references=[ndb.Key('Team', 'frc254')],
                        year=2014)
        self.cdmedia.put()
        self.cddetails = dict()
        self.cddetails["image_partial"] = "fe3/fe38d320428adf4f51ac969efb3db32c_l.jpg"

        self.ytmedia = Media(
                        key=ndb.Key('Media', 'youtube_aFZy8iibMD0'),
                        details_json=None,
                        foreign_key=u'aFZy8iibMD0',
                        media_type_enum=0,
                        references=[ndb.Key('Team', 'frc254')],
                        year=2014)
        self.ytmedia.put()

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

    def testTeamMediaApi(self):
        response = self.testapp.get('/frc254/2014', headers={"X-TBA-App-Id": "tba-tests:team_media-controller-test:v01"})
        media = json.loads(response.body)

        self.assertEqual(len(media), 2)

        cd = media[0]
        self.assertEqual(cd["type"], "cdphotothread")
        self.assertEqual(cd["foreign_key"], "39894")
        self.assertEqual(cd["details"], self.cddetails)

        yt = media[1]
        self.assertEqual(yt["type"], "youtube")
        self.assertEqual(yt["foreign_key"], "aFZy8iibMD0")
        self.assertEqual(yt["details"], {})
class TestDistrictTeamsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<district_abbrev:>/<year:([0-9]*)>', ApiDistrictTeamsController, 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",
                motto = "Infiltrating Young Minds One Robot at a Time",
        )

        self.district_team = DistrictTeam(
                id="2015ne_frc281",
                team=self.team.key,
                year=2015,
                district=3
        )

        self.team.put()
        self.district_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)
        self.assertEqual(team["motto"], self.team.motto)

    def testDistrictsApi(self):
        response = self.testapp.get('/ne/2015', headers={"X-TBA-App-Id": "tba-tests:team-districts-controller-test:v01"})
        teams = json.loads(response.body)
        self.assertTeamJson(teams)
class TestDistrictTeamsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication(
            [webapp2.Route(r"/<district_abbrev:>/<year:([0-9]*)>", ApiDistrictTeamsController, 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",
            motto="Infiltrating Young Minds One Robot at a Time",
        )

        self.district_team = DistrictTeam(id="2015ne_frc281", team=self.team.key, year=2015, district=3)

        self.team.put()
        self.district_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)
        self.assertEqual(team["motto"], self.team.motto)

    def testDistrictsApi(self):
        response = self.testapp.get(
            "/ne/2015", headers={"X-TBA-App-Id": "tba-tests:team-districts-controller-test:v01"}
        )
        teams = json.loads(response.body)
        self.assertTeamJson(teams)
Beispiel #7
0
class TestTeamHistoryDistrictsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([
            webapp2.Route(r'/<team_key:>',
                          ApiTeamHistoryDistrictsController,
                          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="frc1124",
            name="UberBots",
            team_number=1124,
            nickname="UberBots",
        )

        self.district_team = DistrictTeam(id="2015ne_frc1124",
                                          team=self.team.key,
                                          year=2015,
                                          district_key=ndb.Key(
                                              District, '2015ne'))

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

        self.team.put()
        self.district_team.put()
        self.district.put()

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

    def testDistrictsApi(self):
        response = self.testapp.get(
            '/frc1124',
            headers={
                "X-TBA-App-Id":
                "tba-tests:team-history-districts-controller-test:v01"
            })
        district_dict = json.loads(response.body)

        self.assertTrue("2015" in district_dict)
        district_key = district_dict["2015"]

        self.assertEqual(district_key, "2015ne")
Beispiel #8
0
class TestTeamListApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<page_num:([0-9]*)>', ApiTeamListController, 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.team1 = Team(
                id="frc123",
                name="SomeName",
                team_number=123,
                nickname="SomeNickname",
                address="San Jose, CA, USA",
                website="www.website.com",
        )

        self.team2 = Team(
                id="frc4567",
                name="SomeName",
                team_number=4567,
                nickname="SomeNickname",
                address="San Jose, CA, USA",
                website="www.website.com",
        )

        self.team1.put()
        self.team2.put()

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

    def assertTeam1Json(self, team):
        self.assertEqual(team["key"], self.team1.key_name)
        self.assertEqual(team["name"], self.team1.name)
        self.assertEqual(team["team_number"], self.team1.team_number)

    def assertTeam2Json(self, team):
        self.assertEqual(team["key"], self.team2.key_name)
        self.assertEqual(team["name"], self.team2.name)
        self.assertEqual(team["team_number"], self.team2.team_number)

    def testTeamListApi(self):
        response = self.testapp.get('/0', headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertTeam1Json(team_list[0])

        response = self.testapp.get('/9', headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertTeam2Json(team_list[0])

        response = self.testapp.get('/10', headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertEqual(team_list, [])
Beispiel #9
0
    def create_entry_from_params(self, params):
        new_team = Team(title = params["title"],
                        description = params["description"],
                        location = params["location"],
                        league = params["league"],
                        ref_id = params["ref_id"])

        new_team.put()
        return new_team
Beispiel #10
0
class TestDatafeedUsfirstLegacyTeams(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        self.datafeed = DatafeedUsfirstLegacy()

        self.team177 = Team(
            id="frc177",
            team_number=177,
            first_tpid=211521,
            first_tpid_year=2014,
        )
        self.team177.put()

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

    def test_getTeamDetails(self):
        team = self.datafeed.getTeamDetails(self.team177)

        self.assertEqual(team.key.id(), 'frc177')
        self.assertEqual(
            team.name,
            "United Technologies / ClearEdge Power / Gain Talent / EBA&D & South Windsor High School"
        )
        self.assertEqual(team.address, u"South Windsor, CT\xa0 USA")
        self.assertEqual(team.nickname, "Bobcat Robotics")
        self.assertEqual(team.rookie_year, 1995)
        self.assertEqual(team.website, "http://www.bobcatrobotics.org")

    def test_getTeamsTpids(self):
        Team(
            id="frc4409",
            team_number=4409,
            first_tpid=0,  # should be 74735
            first_tpid_year=2011).put()

        # We can skip 2000 records, paginate, and still get frc4409 and frc4410 in 2012
        self.datafeed.getTeamsTpids(2012, skip=2000)

        # Check new team insertion
        frc4410 = Team.get_by_id("frc4410")
        self.assertEqual(frc4410.team_number, 4410)
        self.assertEqual(frc4410.first_tpid, 74193)
        self.assertEqual(frc4410.first_tpid_year, 2012)

        # Check old team updating
        frc4409 = Team.get_by_id("frc4409")
        self.assertEqual(frc4409.team_number, 4409)
        self.assertEqual(frc4409.first_tpid, 74735)
        self.assertEqual(frc4409.first_tpid_year, 2012)
Beispiel #11
0
class TestTeamHistoryRobotsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([
            webapp2.Route(r'/<team_key:>',
                          ApiTeamHistoryRobotsController,
                          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="frc1124",
            name="UberBots",
            team_number=1124,
            nickname="UberBots",
        )

        self.robot = Robot(id="frc1124_2015",
                           team=self.team.key,
                           year=2015,
                           robot_name="Orion")

        self.team.put()
        self.robot.put()

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

    def testRobotApi(self):
        response = self.testapp.get(
            '/frc1124',
            headers={
                "X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"
            })
        robot_dict = json.loads(response.body)

        self.assertTrue("2015" in robot_dict)
        robot = robot_dict["2015"]

        self.assertEqual(robot["key"], "frc1124_2015")
        self.assertEqual(robot["team_key"], "frc1124")
        self.assertEqual(robot["year"], 2015)
        self.assertEqual(robot["name"], "Orion")
class TestDatafeedUsfirstLegacyTeams(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        self.datafeed = DatafeedUsfirstLegacy()

        self.team177 = Team(
            id="frc177",
            team_number=177,
            first_tpid=211521,
            first_tpid_year=2014,
        )
        self.team177.put()

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

    def test_getTeamDetails(self):
        team = self.datafeed.getTeamDetails(self.team177)

        self.assertEqual(team.key.id(), 'frc177')
        self.assertEqual(team.name, "United Technologies / ClearEdge Power / Gain Talent / EBA&D & South Windsor High School")
        self.assertEqual(team.address, u"South Windsor, CT\xa0 USA")
        self.assertEqual(team.nickname, "Bobcat Robotics")
        self.assertEqual(team.rookie_year, 1995)
        self.assertEqual(team.website, "http://www.bobcatrobotics.org")

    def test_getTeamsTpids(self):
        Team(
          id="frc4409",
          team_number=4409,
          first_tpid=0,  # should be 74735
          first_tpid_year=2011
        ).put()

        # We can skip 2000 records, paginate, and still get frc4409 and frc4410 in 2012
        self.datafeed.getTeamsTpids(2012, skip=2000)

        # Check new team insertion
        frc4410 = Team.get_by_id("frc4410")
        self.assertEqual(frc4410.team_number, 4410)
        self.assertEqual(frc4410.first_tpid, 74193)
        self.assertEqual(frc4410.first_tpid_year, 2012)

        # Check old team updating
        frc4409 = Team.get_by_id("frc4409")
        self.assertEqual(frc4409.team_number, 4409)
        self.assertEqual(frc4409.first_tpid, 74735)
        self.assertEqual(frc4409.first_tpid_year, 2012)
class TestDatafeedUsfirstTeams(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        self.datafeed = DatafeedUsfirst()

        self.team177 = Team(
            id="frc177",
            team_number=177,
            first_tpid=61771,
            first_tpid_year=2012
        )
        self.team177.put()

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

    def test_getTeamDetails(self):
        team = self.datafeed.getTeamDetails(self.team177)

        ## Broken as result of FIRST website redesign -gregmarra 20151122
        # self.assertEqual(team.name, "UTC Power/Ensign Bickford Aerospace & Defense & South Windsor High School")
        # self.assertEqual(team.address, u"South Windsor, CT, USA")
        # self.assertEqual(team.nickname, "Bobcat Robotics")
        # self.assertEqual(team.website, "http://www.bobcatrobotics.org")

    def test_getTeamsTpids(self):
        Team(
          id="frc4409",
          team_number=4409,
          first_tpid=0,  # should be 74735
          first_tpid_year=2011
        ).put()

        # We can skip 2000 records, paginate, and still get frc4409 and frc4410 in 2012
        self.datafeed.getTeamsTpids(2012, skip=2000)

        # Check new team insertion
        frc4410 = Team.get_by_id("frc4410")
        self.assertEqual(frc4410.team_number, 4410)
        self.assertEqual(frc4410.first_tpid, 74193)
        self.assertEqual(frc4410.first_tpid_year, 2012)

        # Check old team updating
        frc4409 = Team.get_by_id("frc4409")
        self.assertEqual(frc4409.team_number, 4409)
        self.assertEqual(frc4409.first_tpid, 74735)
        self.assertEqual(frc4409.first_tpid_year, 2012)
Beispiel #14
0
class TestDatafeedUsfirstTeams(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        self.datafeed = DatafeedUsfirst()

        self.team177 = Team(id="frc177",
                            team_number=177,
                            first_tpid=61771,
                            first_tpid_year=2012)
        self.team177.put()

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

    def test_getTeamDetails(self):
        team = self.datafeed.getTeamDetails(self.team177)

        self.assertEqual(
            team.name,
            "UTC Power/Ensign Bickford Aerospace & Defense & South Windsor High School"
        )
        self.assertEqual(team.address, u"South Windsor, CT, USA")
        self.assertEqual(team.nickname, "Bobcat Robotics")
        self.assertEqual(team.website, "http://www.bobcatrobotics.org")

    def test_getTeamsTpids(self):
        Team(
            id="frc4409",
            team_number=4409,
            first_tpid=0,  # should be 74735
            first_tpid_year=2011).put()

        # We can skip 2000 records, paginate, and still get frc4409 and frc4410 in 2012
        self.datafeed.getTeamsTpids(2012, skip=2000)

        # Check new team insertion
        frc4410 = Team.get_by_id("frc4410")
        self.assertEqual(frc4410.team_number, 4410)
        self.assertEqual(frc4410.first_tpid, 74193)
        self.assertEqual(frc4410.first_tpid_year, 2012)

        # Check old team updating
        frc4409 = Team.get_by_id("frc4409")
        self.assertEqual(frc4409.team_number, 4409)
        self.assertEqual(frc4409.first_tpid, 74735)
        self.assertEqual(frc4409.first_tpid_year, 2012)
Beispiel #15
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(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,
            rookie_year=1999,
            nickname="EnTech GreenVillians",
            address="Greenville, SC, USA",
            website="www.entech.org",
        )
        self.team.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)
        self.assertEqual(team["rookie_year"], self.team.rookie_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)
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(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,
                rookie_year=1999,
                nickname="EnTech GreenVillians",
                city="Greenville",
                state_prov="SC",
                country="USA",
                website="www.entech.org",
                motto = "Infiltrating Young Minds One Robot at a Time",
        )
        self.team.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)
        self.assertEqual(team["rookie_year"], self.team.rookie_year)
        self.assertEqual(team["motto"], self.team.motto)

    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)
class TestTeamHistoryDistrictsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>', ApiTeamHistoryDistrictsController, 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="frc1124",
            name="UberBots",
            team_number=1124,
            nickname="UberBots"
        )

        self.district_team = DistrictTeam(
            id="2015ne_frc1124",
            team=self.team.key,
            year=2015,
            district_key=ndb.Key(District, '2015ne')
        )

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

        self.team.put()
        self.district_team.put()
        self.district.put()

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

    def testDistrictsApi(self):
        response = self.testapp.get('/frc1124', headers={"X-TBA-App-Id": "tba-tests:team-history-districts-controller-test:v01"})
        district_dict = json.loads(response.body)

        self.assertTrue("2015" in district_dict)
        district_key = district_dict["2015"]

        self.assertEqual(district_key, "2015ne")
class TestTeamHistoryRobotsApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication([webapp2.Route(r'/<team_key:>', ApiTeamHistoryRobotsController, 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="frc1124",
            name="UberBots",
            team_number=1124,
            nickname="UberBots"
        )

        self.robot = Robot(
            id="frc1124_2015",
            team=self.team.key,
            year=2015,
            robot_name="Orion"
        )

        self.team.put()
        self.robot.put()

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

    def testRobotApi(self):
        response = self.testapp.get('/frc1124', headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        robot_dict = json.loads(response.body)

        self.assertTrue("2015" in robot_dict)
        robot = robot_dict["2015"]

        self.assertEqual(robot["key"], "frc1124_2015")
        self.assertEqual(robot["team_key"], "frc1124")
        self.assertEqual(robot["year"], 2015)
        self.assertEqual(robot["name"], "Orion")
    def test_team_awards(self):
        # Insert some Teams
        frc1 = Team(
            id='frc1',
            team_number=1
        )
        frc1.put()
        frc2 = Team(
            id='frc2',
            team_number=2
        )
        frc2.put()
        frc3 = Team(
            id='frc3',
            team_number=3
        )
        frc3.put()
        # Insert some Awards for some Teams
        award = Award(
            id=Award.render_key_name(self.event_ends_today.key_name, AwardType.INDUSTRIAL_DESIGN),
            name_str='Industrial Design Award sponsored by General Motors',
            award_type_enum=AwardType.INDUSTRIAL_DESIGN,
            event=self.event_ends_today.key,
            event_type_enum=EventType.REGIONAL,
            team_list=[ndb.Key(Team, 'frc1')],
            year=2020
        )
        award.put()
        winner_award = Award(
            id=Award.render_key_name(self.event_ends_today.key_name, AwardType.WINNER),
            name_str='Regional Event Winner',
            award_type_enum=AwardType.WINNER,
            event=self.event_ends_today.key,
            event_type_enum=EventType.REGIONAL,
            team_list=[ndb.Key(Team, 'frc2'), ndb.Key(Team, 'frc1')],
            year=2020
        )
        winner_award.put()

        self.assertItemsEqual(self.event_ends_today.team_awards().keys(), [frc1.key, frc2.key])
Beispiel #20
0
class TestSuggestTeamMediaController(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_user_stub()
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(r'/suggest/team/media',
                          SuggestTeamMediaController,
                          'suggest-team-media',
                          strict_slash=True),
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

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

    def loginUser(self):
        self.testbed.setup_env(user_email="*****@*****.**",
                               user_id="123",
                               user_is_admin='0',
                               overwrite=True)

        Account.get_or_insert("123", email="*****@*****.**", registered=True)

    def storeTeam(self):
        self.team = Team(
            id="frc1124",
            team_number=1124,
        )
        self.team.put()

    def getSuggestionForm(self, team_key, year):
        response = self.testapp.get(
            '/suggest/team/media?team_key={}&year={}'.format(team_key, year))
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('suggest_media', None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get(
            '/suggest/team/media?team_key=frc1124&year=2016', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_no_params(self):
        self.loginUser()
        response = self.testapp.get('/suggest/team/media', status='3*')
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, '/')

    def test_submit_empty_form(self):
        self.loginUser()
        self.storeTeam()
        form = self.getSuggestionForm('frc1124', 2016)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        request = response.request
        self.assertEqual(request.GET.get('status'), 'bad_url')

    def test_bad_team(self):
        self.loginUser()
        response = self.testapp.get(
            '/suggest/team/media?team_key=frc1124&year=2016', status='3*')
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, '/')

    def test_suggest_media(self):
        self.loginUser()
        self.storeTeam()
        form = self.getSuggestionForm('frc1124', 2016)
        form['media_url'] = 'http://imgur.com/aF8T5ZE'
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        request = response.request
        self.assertEqual(request.GET.get('status'), 'success')

        suggestion = Suggestion.get_by_id(
            'media_2016_team_frc1124_imgur_aF8T5ZE')
        self.assertIsNotNone(suggestion)
class TestTeamAdminRedeem(unittest2.TestCase):
    def setUp(self):
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=1)
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        self.testbed.init_user_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_taskqueue_stub(_all_queues_valid=True)
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(
                r'/mod/redeem',
                TeamAdminRedeem,
                'team-admin',
                strict_slash=True),
        ])
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            name="Team",
            team_number=1124,
        )
        self.team.put()
        self.now = datetime.datetime.now()

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

    def loginUser(self):
        self.testbed.setup_env(
            user_email="*****@*****.**",
            user_id="123",
            user_is_admin='0',
            overwrite=True)

        self.account = Account.get_or_insert(
            "123", email="*****@*****.**", registered=True)

    def addTeamAdminAccess(self, account, team_number=1124):
        access = TeamAdminAccess(
            id="test_access",
            access_code="abc123",
            team_number=team_number,
            year=self.now.year,
            expiration=self.now + datetime.timedelta(days=1),
            account=account,
        )
        return access.put()

    def getForm(self):
        response = self.testapp.get('/mod/redeem')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('redeem', None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/mod/redeem', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_cant_redeem_with_code_linked(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=self.account.key)
        response = self.testapp.get('/mod/redeem')
        self.assertEqual(response.status_int, 200)

        # If there's an existing code linked, the form shouldn't render
        form = response.forms.get('redeem', None)
        self.assertIsNone(form)

    def test_redeem_bad_code(self):
        self.loginUser()

        form = self.getForm()
        form['auth_code'] = 'abc123'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_no_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_garbage_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = 'meow'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_bad_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '11245'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_code(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '1124'
        response = form.submit().follow()

        access = access_key.get()
        self.assertEqual(response.request.GET['status'], 'success')
        self.assertEqual(self.account.key, access.account)

    def test_redeem_code_with_whitespace(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = ' abc123 '
        form['team_number'] = '1124'
        response = form.submit().follow()

        access = access_key.get()
        self.assertEqual(response.request.GET['status'], 'success')
        self.assertEqual(self.account.key, access.account)

    def test_redeem_used_code(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(
            account=ndb.Key(Account, '*****@*****.**'))

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '1124'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'code_used')

    def test_redeem_code_existing_link(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'

        access = access_key.get()
        access.account = self.account.key
        access.put()

        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'already_linked')
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 TestShortController(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"/event/<event_key>", EventDetail, "event-detail"),
            RedirectRoute(r"/<:(frc)?><team_number:[0-9]+>", ShortTeamHandler, "short-team-canonical"),
            RedirectRoute(r"/<event_key:[0-9]{4}[a-z0-9]+>", ShortEventHandler, "short-event-detail"),
        ], debug=True)
        self.testapp = webtest.TestApp(app)

        self.team1 = Team(
            id="frc1",
            team_number=1,
        )
        self.team2 = Team(
            id="frc16",
            team_number=16,
        )
        self.team3 = Team(
            id="frc254",
            team_number=254,
        )
        self.team4 = Team(
            id="frc2521",
            team_number=2521,
        )

        self.event1 = Event(
            id="2017necmp",
            name="New England District Championship",
            event_type_enum=EventType.DISTRICT_CMP,
            short_name="New England",
            event_short="necmp",
            year=2017,
            end_date=datetime(2017, 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(2017, 03, 24),
            webcast_json="[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]",
            website="http://www.firstsv.org"
        )

        self.event2 = Event(
            id="2017mndu2",
            name="Northern Lights Regional",
            event_type_enum=EventType.REGIONAL,
            short_name="Northern Lights",
            event_short="mndu2",
            year=2017,
            end_date=datetime(2017, 03, 04),
            official=True,
            city="Duluth",
            state_prov="MN",
            country="USA",
            venue="Duluth Entertainment Convention Center",
            venue_address="Duluth Entertainment Convention Center, Duluth, MN, USA",
            timezone_id="America/New_York",
            start_date=datetime(2017, 03, 1),
            webcast_json="[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]",
            website="http://www.mnfirst.org"
        )

        self.team1.put()
        self.team2.put()
        self.team3.put()
        self.team4.put()
        self.event1.put()
        self.event2.put()

    def test_team_redirect(self):
        # 1 digit team
        response = self.testapp.get("/1", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/1")

        response = self.testapp.get("/frc1", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/1")

        # 2 digit team
        response = self.testapp.get("/16", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/16")

        response = self.testapp.get("/frc16", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/16")

        # 3 digit team
        response = self.testapp.get("/254", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/254")

        response = self.testapp.get("/frc254", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/254")

        # 4 digit team
        response = self.testapp.get("/2521", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/2521")

        response = self.testapp.get("/frc2521", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/2521")

    def test_event_redirect(self):
        # Normal event code
        response = self.testapp.get("/2017necmp", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/event/2017necmp")

        # Event code with numbers
        response = self.testapp.get("/2017mndu2", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/event/2017mndu2")

        # Non-existing event code
        response = self.testapp.get("/2017meow", status="3*")
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, "/event/2017meow")
        self.assertEqual(response.status_int, 404)

    def test_no_redirect(self):
        # Teams

        # Negative team number
        response = self.testapp.get("/-2521", status=404)
        self.assertEqual(response.status_int, 404)

        # Events

        # Semi-real year
        response = self.testapp.get("/217nytr", status=404)
        self.assertEqual(response.status_int, 404)
class TestTeamManipulator(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.old_team = Team(
            id="frc177",
            team_number=177,
            rookie_year=1996,
            first_tpid=61771,
            first_tpid_year=2012,
        )

        self.new_team = Team(
            id="frc177",
            team_number=177,
            rookie_year=1995,
            website="http://www.bobcatrobotics.org",
        )

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

    def assertMergedTeam(self, team):
        self.assertOldTeam(team)
        self.assertEqual(team.website, "http://www.bobcatrobotics.org")
        self.assertEqual(team.rookie_year, 1995)

    def assertOldTeam(self, team):
        self.assertEqual(team.first_tpid, 61771)
        self.assertEqual(team.first_tpid_year, 2012)
        self.assertEqual(team.key_name, "frc177")
        self.assertEqual(team.team_number, 177)

    def test_createOrUpdate(self):
        TeamManipulator.createOrUpdate(self.old_team)
        self.assertOldTeam(Team.get_by_id("frc177"))
        TeamManipulator.createOrUpdate(self.new_team)
        self.assertMergedTeam(Team.get_by_id("frc177"))

    def test_findOrSpawn(self):
        self.old_team.put()
        self.assertMergedTeam(TeamManipulator.findOrSpawn(self.new_team))

    def test_updateMerge(self):
        self.assertMergedTeam(
            TeamManipulator.updateMerge(self.new_team, self.old_team))

    def test_create_lots_of_teams(self):
        number = 500
        teams = [
            Team(id="frc%s" % team_number, team_number=team_number)
            for team_number in range(number)
        ]
        TeamManipulator.createOrUpdate(teams)

        team = Team.get_by_id("frc177")
        self.assertEqual(team.key_name, "frc177")
        self.assertEqual(team.team_number, 177)

        team = Team.get_by_id("frc%s" % (number - 1))
        self.assertEqual(team.key_name, "frc%s" % (number - 1))
        self.assertEqual(team.team_number, number - 1)
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])
Beispiel #26
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 TestTeamListApiController(unittest2.TestCase):
    def setUp(self):
        app = webapp2.WSGIApplication(
            [webapp2.Route(r"/<page_num:([0-9]*)>", ApiTeamListController, 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.team1 = Team(
            id="frc123",
            name="SomeName",
            team_number=123,
            nickname="SomeNickname",
            city="San Jose",
            state_prov="CA",
            country="USA",
            website="www.website.com",
        )

        self.team2 = Team(
            id="frc4567",
            name="SomeName",
            team_number=4567,
            nickname="SomeNickname",
            city="San Jose",
            state_prov="CA",
            country="USA",
            website="www.website.com",
        )

        self.team1.put()
        self.team2.put()

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

    def assertTeam1Json(self, team):
        self.assertEqual(team["key"], self.team1.key_name)
        self.assertEqual(team["name"], self.team1.name)
        self.assertEqual(team["team_number"], self.team1.team_number)

    def assertTeam2Json(self, team):
        self.assertEqual(team["key"], self.team2.key_name)
        self.assertEqual(team["name"], self.team2.name)
        self.assertEqual(team["team_number"], self.team2.team_number)

    def testTeamListApi(self):
        response = self.testapp.get("/0", headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertTeam1Json(team_list[0])

        response = self.testapp.get("/9", headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertTeam2Json(team_list[0])

        response = self.testapp.get("/10", headers={"X-TBA-App-Id": "tba-tests:team_list-controller-test:v01"})
        team_list = json.loads(response.body)
        self.assertEqual(team_list, [])
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)
Beispiel #29
0
class TestTeamAdminRedeem(unittest2.TestCase):
    def setUp(self):
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=1)
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        self.testbed.init_user_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_taskqueue_stub(_all_queues_valid=True)
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(r'/mod/redeem',
                          TeamAdminRedeem,
                          'team-admin',
                          strict_slash=True),
        ])
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            name="Team",
            team_number=1124,
        )
        self.team.put()
        self.now = datetime.datetime.now()

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

    def loginUser(self):
        self.testbed.setup_env(user_email="*****@*****.**",
                               user_id="123",
                               user_is_admin='0',
                               overwrite=True)

        self.account = Account.get_or_insert("123",
                                             email="*****@*****.**",
                                             registered=True)

    def addTeamAdminAccess(self, account, team_number=1124):
        access = TeamAdminAccess(
            id="test_access",
            access_code="abc123",
            team_number=team_number,
            year=self.now.year,
            expiration=self.now + datetime.timedelta(days=1),
            account=account,
        )
        return access.put()

    def getForm(self):
        response = self.testapp.get('/mod/redeem')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('redeem', None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/mod/redeem', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_cant_redeem_with_code_linked(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=self.account.key)
        response = self.testapp.get('/mod/redeem')
        self.assertEqual(response.status_int, 200)

        # If there's an existing code linked, the form shouldn't render
        form = response.forms.get('redeem', None)
        self.assertIsNone(form)

    def test_redeem_bad_code(self):
        self.loginUser()

        form = self.getForm()
        form['auth_code'] = 'abc123'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_no_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_garbage_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = 'meow'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_bad_team(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '11245'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'invalid_code')

    def test_redeem_code(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '1124'
        response = form.submit().follow()

        access = access_key.get()
        self.assertEqual(response.request.GET['status'], 'success')
        self.assertEqual(self.account.key, access.account)

    def test_redeem_used_code(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(
            account=ndb.Key(Account, '*****@*****.**'))

        form = self.getForm()
        form['auth_code'] = 'abc123'
        form['team_number'] = '1124'
        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'code_used')

    def test_redeem_code_existing_link(self):
        self.loginUser()
        access_key = self.addTeamAdminAccess(account=None)

        form = self.getForm()
        form['auth_code'] = 'abc123'

        access = access_key.get()
        access.account = self.account.key
        access.put()

        response = form.submit().follow()

        self.assertEqual(response.request.GET['status'], 'already_linked')
class TestSuggestTeamAdminSuggestionReview(unittest2.TestCase):
    def setUp(self):
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=1)
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        self.testbed.init_user_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_taskqueue_stub(_all_queues_valid=True)
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(
                r'/mod', TeamAdminDashboard, 'team-admin', strict_slash=True),
            RedirectRoute(r'/suggest/cad/review',
                          SuggestDesignsReviewController,
                          'review-designs',
                          strict_slash=True),
            RedirectRoute(r'/suggest/team/media/review',
                          SuggestTeamMediaReviewController,
                          'review-media',
                          strict_slash=True),
            RedirectRoute(r'/suggest/team/social/review',
                          SuggestSocialMediaReviewController,
                          'review-social',
                          strict_slash=True),
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            name="Team",
            team_number=1124,
        )
        self.team.put()
        self.now = datetime.datetime.now()

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

    def loginUser(self):
        self.testbed.setup_env(user_email="*****@*****.**",
                               user_id="123",
                               user_is_admin='0',
                               overwrite=True)

        self.account = Account.get_or_insert("123",
                                             email="*****@*****.**",
                                             registered=True)

    def giveTeamAdminAccess(self, expiration_days=1):
        access = TeamAdminAccess(
            id="test_access",
            team_number=1124,
            year=self.now.year,
            expiration=self.now + datetime.timedelta(days=expiration_days),
            account=self.account.key,
        )
        return access.put()

    def createMediaSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key, 'http://imgur.com/foobar', 'frc1124',
            self.now.year)
        self.assertEqual(status[0], 'success')
        return Suggestion.query().fetch(keys_only=True)[0].id()

    def createSocialMediaSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key, 'http://twitter.com/frc1124', 'frc1124', None,
            None, True)
        self.assertEqual(status[0], 'success')
        return Suggestion.query().fetch(keys_only=True)[0].id()

    def createDesignSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key,
            'https://grabcad.com/library/2016-148-robowranglers-1', 'frc1124',
            '2016')
        self.assertEqual(status[0], 'success')
        return Suggestion.render_media_key_name('2016', 'team', 'frc1124',
                                                'grabcad',
                                                '2016-148-robowranglers-1')

    def getSuggestionForm(self, suggestion_type):
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('review_{}'.format(suggestion_type), None)
        self.assertIsNotNone(form)
        return form

    def getMediaAdminForm(self, action, media_key_name):
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('{}_{}'.format(action, media_key_name), None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/mod', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_no_access(self):
        self.loginUser()
        response = self.testapp.get('/mod', status='403', expect_errors=True)
        self.assertEqual(response.status_int, 403)

    def test_expired_access(self):
        self.loginUser()
        self.giveTeamAdminAccess(expiration_days=-1)
        response = self.testapp.get('/mod', status='403', expect_errors=True)
        self.assertEqual(response.status_int, 403)

    def test_nothing_to_review(self):
        self.loginUser()
        self.giveTeamAdminAccess()
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

    """
    Test moderating existing media items (remove reference, manage preferred)
    """

    def test_manage_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createSocialMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()

        response = form.submit(status='403', expect_errors=True)
        self.assertEqual(response.status_int, 403)

    def test_remove_social_media_reference(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createSocialMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertFalse(team_reference in media.references)

    def test_remove_media_reference(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertFalse(team_reference in media.references)

    def test_make_media_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('add_preferred', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertTrue(team_reference in media.references)
        self.assertTrue(team_reference in media.preferred_references)

    def test_remove_media_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media.preferred_references.append(team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_preferred', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertTrue(team_reference in media.references)
        self.assertFalse(team_reference in media.preferred_references)

    """
    Test accepting/rejecting suggestions for the given team
    These are basically the same tests as the individual suggestion review
    controller tests, but since we post to that same URL, we'll want to make
    sure everything works from both paths
    """

    def test_accept_team_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_team_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_team_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'foobar')
        self.assertEqual(media.media_type_enum, MediaType.IMGUR)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

    def test_accept_team_media_as_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        form['preferred_keys[]'] = ['preferred::{}'.format(suggestion_id)]
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'foobar')
        self.assertEqual(media.media_type_enum, MediaType.IMGUR)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.preferred_references)

    def test_reject_team_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 0)

    def test_accept_social_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_social_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_social_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'frc1124')
        self.assertEqual(media.media_type_enum, MediaType.TWITTER_PROFILE)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

    def test_reject_social_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 0)

    def test_accept_robot_design_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_robot_design_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_robot_design(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object gets created
        media = Media.query().fetch()[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.media_type_enum, MediaType.GRABCAD)
        self.assertEqual(media.year, 2016)
        self.assertListEqual(media.references, [self.team.key])

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

    def test_reject_robot_design(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object doesn't get created
        medias = Media.query().fetch(keys_only=True)
        self.assertEqual(len(medias), 0)

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)
Beispiel #31
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])
class TestSuggestTeamAdminSuggestionReview(unittest2.TestCase):
    def setUp(self):
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=1)
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        self.testbed.init_user_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_taskqueue_stub(_all_queues_valid=True)
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication(
            [
                RedirectRoute(
                    r'/mod',
                    TeamAdminDashboard,
                    'team-admin',
                    strict_slash=True),
                RedirectRoute(
                    r'/mod/redeem',
                    TeamAdminRedeem,
                    'team-admin',
                    strict_slash=True),
                RedirectRoute(
                    r'/suggest/cad/review',
                    SuggestDesignsReviewController,
                    'review-designs',
                    strict_slash=True),
                RedirectRoute(
                    r'/suggest/team/media/review',
                    SuggestTeamMediaReviewController,
                    'review-media',
                    strict_slash=True),
                RedirectRoute(
                    r'/suggest/team/social/review',
                    SuggestSocialMediaReviewController,
                    'review-social',
                    strict_slash=True),
            ],
            debug=True)
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            name="Team",
            team_number=1124,
        )
        self.team.put()
        self.now = datetime.datetime.now()

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

    def loginUser(self):
        self.testbed.setup_env(
            user_email="*****@*****.**",
            user_id="123",
            user_is_admin='0',
            overwrite=True)

        self.account = Account.get_or_insert(
            "123", email="*****@*****.**", registered=True)

    def giveTeamAdminAccess(self, expiration_days=1):
        access = TeamAdminAccess(
            id="test_access",
            team_number=1124,
            year=self.now.year,
            expiration=self.now + datetime.timedelta(days=expiration_days),
            account=self.account.key,
        )
        return access.put()

    def createMediaSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key, 'http://imgur.com/foobar', 'frc1124',
            self.now.year)
        self.assertEqual(status[0], 'success')
        return Suggestion.query().fetch(keys_only=True)[0].id()

    def createSocialMediaSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key, 'http://twitter.com/frc1124', 'frc1124', None,
            None, True)
        self.assertEqual(status[0], 'success')
        return Suggestion.query().fetch(keys_only=True)[0].id()

    def createDesignSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key,
            'https://grabcad.com/library/2016-148-robowranglers-1', 'frc1124',
            '2016')
        self.assertEqual(status[0], 'success')
        return Suggestion.render_media_key_name(
            '2016', 'team', 'frc1124', 'grabcad', '2016-148-robowranglers-1')

    def getSuggestionForm(self, suggestion_type):
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('review_{}'.format(suggestion_type), None)
        self.assertIsNotNone(form)
        return form

    def getMediaAdminForm(self, action, media_key_name):
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('{}_{}'.format(action, media_key_name), None)
        self.assertIsNotNone(form)
        return form

    def getTeamInfoForm(self, team_number):
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('team-info-frc{}'.format(team_number), None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/mod', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_no_access(self):
        self.loginUser()
        response = self.testapp.get('/mod', status='3*').follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.path, "/mod/redeem")

    def test_expired_access(self):
        self.loginUser()
        self.giveTeamAdminAccess(expiration_days=-1)
        response = self.testapp.get('/mod', status='3*').follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.path, "/mod/redeem")

    def test_nothing_to_review(self):
        self.loginUser()
        self.giveTeamAdminAccess()
        response = self.testapp.get('/mod')
        self.assertEqual(response.status_int, 200)

    """
    Test moderating existing media items (remove reference, manage preferred)
    """

    def test_manage_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createSocialMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()

        response = form.submit(status='403', expect_errors=True)
        self.assertEqual(response.status_int, 403)

    def test_remove_social_media_reference(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createSocialMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertFalse(team_reference in media.references)

    def test_remove_media_reference(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_media', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertFalse(team_reference in media.references)

    def test_make_media_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('add_preferred', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertTrue(team_reference in media.references)
        self.assertTrue(team_reference in media.preferred_references)

    def test_remove_media_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        team_reference = Media.create_reference('team', 'frc1124')
        suggestion_id = self.createMediaSuggestion()
        suggestion = Suggestion.get_by_id(suggestion_id)
        media = MediaCreator.create_media_model(suggestion, team_reference)
        media.preferred_references.append(team_reference)
        media_id = media.put()
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

        form = self.getMediaAdminForm('remove_preferred', media_id.id())
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        media = media_id.get()
        self.assertTrue(team_reference in media.references)
        self.assertFalse(team_reference in media.preferred_references)

    """
    Test modifying team properties
    """

    def test_set_robot_name(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        # There is no Robot models that exists yet for this team
        form = self.getTeamInfoForm(1124)
        form['robot_name'] = 'Test Robot Name'
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        robot = Robot.get_by_id(Robot.renderKeyName('frc1124', self.now.year))
        self.assertIsNotNone(robot)
        self.assertEqual(robot.robot_name, 'Test Robot Name')

    def test_update_robot_name(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        Robot(
            id=Robot.renderKeyName(self.team.key_name, self.now.year),
            team=self.team.key,
            year=self.now.year,
            robot_name='First Robot Name',
        ).put()

        form = self.getTeamInfoForm(1124)
        self.assertEqual(form['robot_name'].value, 'First Robot Name')
        form['robot_name'] = 'Second Robot Name'
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        robot = Robot.get_by_id(Robot.renderKeyName('frc1124', self.now.year))
        self.assertIsNotNone(robot)
        self.assertEqual(robot.robot_name, 'Second Robot Name')

    def test_delete_robot_name(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        Robot(
            id=Robot.renderKeyName(self.team.key_name, self.now.year),
            team=self.team.key,
            year=self.now.year,
            robot_name='First Robot Name',
        ).put()

        form = self.getTeamInfoForm(1124)
        self.assertEqual(form['robot_name'].value, 'First Robot Name')
        form['robot_name'] = ''
        response = form.submit().follow()
        self.assertEqual(response.status_int, 301)

        robot = Robot.get_by_id(Robot.renderKeyName('frc1124', self.now.year))
        self.assertIsNone(robot)

    """
    Test accepting/rejecting suggestions for the given team
    These are basically the same tests as the individual suggestion review
    controller tests, but since we post to that same URL, we'll want to make
    sure everything works from both paths
    """

    def test_accept_team_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_team_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_team_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'foobar')
        self.assertEqual(media.media_type_enum, MediaType.IMGUR)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

    def test_accept_team_media_as_preferred(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        form['preferred_keys[]'] = ['preferred::{}'.format(suggestion_id)]
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'foobar')
        self.assertEqual(media.media_type_enum, MediaType.IMGUR)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.preferred_references)

    def test_reject_team_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createMediaSuggestion()
        form = self.getSuggestionForm('media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 0)

    def test_accept_social_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_social_media_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_social_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 1)
        media = medias[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.foreign_key, 'frc1124')
        self.assertEqual(media.media_type_enum, MediaType.TWITTER_PROFILE)
        self.assertTrue(ndb.Key(Team, 'frc1124') in media.references)

    def test_reject_social_media(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createSocialMediaSuggestion()
        form = self.getSuggestionForm('social-media')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

        medias = Media.query().fetch()
        self.assertEqual(len(medias), 0)

    def test_accept_robot_design_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_reject_robot_design_expired_auth(self):
        self.loginUser()
        access_key = self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        access = access_key.get()
        access.expiration += datetime.timedelta(days=-7)
        access.put()
        response = form.submit().follow(expect_errors=True)
        self.assertEqual(response.request.path, "/")

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_PENDING)

    def test_accept_robot_design(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object gets created
        media = Media.query().fetch()[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.media_type_enum, MediaType.GRABCAD)
        self.assertEqual(media.year, 2016)
        self.assertListEqual(media.references, [self.team.key])

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

    def test_reject_robot_design(self):
        self.loginUser()
        self.giveTeamAdminAccess()

        suggestion_id = self.createDesignSuggestion()
        form = self.getSuggestionForm('robot')
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object doesn't get created
        medias = Media.query().fetch(keys_only=True)
        self.assertEqual(len(medias), 0)

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)
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(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 TestShortController(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"/event/<event_key>", EventDetail, "event-detail"),
            RedirectRoute(r"/<:(frc)?><team_number:[0-9]+>", ShortTeamHandler,
                          "short-team-canonical"),
            RedirectRoute(r"/<event_key:[0-9]{4}[a-z0-9]+>", ShortEventHandler,
                          "short-event-detail"),
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

        self.team1 = Team(
            id="frc1",
            team_number=1,
        )
        self.team2 = Team(
            id="frc16",
            team_number=16,
        )
        self.team3 = Team(
            id="frc254",
            team_number=254,
        )
        self.team4 = Team(
            id="frc2521",
            team_number=2521,
        )

        self.event1 = Event(
            id="2017necmp",
            name="New England District Championship",
            event_type_enum=EventType.DISTRICT_CMP,
            short_name="New England",
            event_short="necmp",
            year=2017,
            end_date=datetime(2017, 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(2017, 03, 24),
            webcast_json=
            "[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]",
            website="http://www.firstsv.org")

        self.event2 = Event(
            id="2017mndu2",
            name="Northern Lights Regional",
            event_type_enum=EventType.REGIONAL,
            short_name="Northern Lights",
            event_short="mndu2",
            year=2017,
            end_date=datetime(2017, 03, 04),
            official=True,
            city="Duluth",
            state_prov="MN",
            country="USA",
            venue="Duluth Entertainment Convention Center",
            venue_address=
            "Duluth Entertainment Convention Center, Duluth, MN, USA",
            timezone_id="America/New_York",
            start_date=datetime(2017, 03, 1),
            webcast_json=
            "[{\"type\": \"twitch\", \"channel\": \"frcgamesense\"}]",
            website="http://www.mnfirst.org")

        self.team1.put()
        self.team2.put()
        self.team3.put()
        self.team4.put()
        self.event1.put()
        self.event2.put()

    def test_team_redirect(self):
        # 1 digit team
        response = self.testapp.get("/1", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/1")

        response = self.testapp.get("/frc1", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/1")

        # 2 digit team
        response = self.testapp.get("/16", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/16")

        response = self.testapp.get("/frc16", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/16")

        # 3 digit team
        response = self.testapp.get("/254", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/254")

        response = self.testapp.get("/frc254", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/254")

        # 4 digit team
        response = self.testapp.get("/2521", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/2521")

        response = self.testapp.get("/frc2521", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/team/2521")

    def test_event_redirect(self):
        # Normal event code
        response = self.testapp.get("/2017necmp", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/event/2017necmp")

        # Event code with numbers
        response = self.testapp.get("/2017mndu2", status="3*")
        response = response.follow()
        self.assertEqual(response.request.path, "/event/2017mndu2")

        # Non-existing event code
        response = self.testapp.get("/2017meow", status="3*")
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, "/event/2017meow")
        self.assertEqual(response.status_int, 404)

    def test_no_redirect(self):
        # Teams

        # Negative team number
        response = self.testapp.get("/-2521", status=404)
        self.assertEqual(response.status_int, 404)

        # Events

        # Semi-real year
        response = self.testapp.get("/217nytr", status=404)
        self.assertEqual(response.status_int, 404)
Beispiel #35
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()
        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 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 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)
Beispiel #38
0
 def _create_team(self, title, description, league, location):
     team = Team(title = title, description = description, league =
                 league, location = location)
     team_key = str(team.put())
     return team
class TestSuggestDesignsReviewController(unittest2.TestCase):
    def setUp(self):
        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(
            probability=1)
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)
        self.testbed.init_memcache_stub()
        self.testbed.init_user_stub()
        self.testbed.init_urlfetch_stub()
        ndb.get_context().clear_cache(
        )  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(r'/suggest/cad/review',
                          SuggestDesignsReviewController,
                          'review-designs',
                          strict_slash=True),
            RedirectRoute(r'/suggest/review',
                          SuggestReviewHomeController,
                          'review-home',
                          strict_slash=True),
        ],
                                      debug=True)
        self.testapp = webtest.TestApp(app)

        self.team = Team(
            id="frc1124",
            team_number=1124,
        )
        self.team.put()

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

    def loginUser(self):
        self.testbed.setup_env(user_email="*****@*****.**",
                               user_id="123",
                               user_is_admin='0',
                               overwrite=True)

        self.account = Account.get_or_insert("123",
                                             email="*****@*****.**",
                                             registered=True)

    def givePermission(self):
        self.account.permissions.append(AccountPermissions.REVIEW_DESIGNS)
        self.account.put()

    def createSuggestion(self):
        status = SuggestionCreator.createTeamMediaSuggestion(
            self.account.key,
            'https://grabcad.com/library/2016-148-robowranglers-1', 'frc1124',
            '2016')
        self.assertEqual(status[0], 'success')
        return Suggestion.render_media_key_name('2016', 'team', 'frc1124',
                                                'grabcad',
                                                '2016-148-robowranglers-1')

    def getSuggestionForm(self):
        response = self.testapp.get('/suggest/cad/review')
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('review_designs', None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/suggest/cad/review', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(
            response.request.path.startswith("/account/login_required"))

    def test_no_permissions(self):
        self.loginUser()
        response = self.testapp.get('/suggest/cad/review', status='3*')
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, '/')

    def test_nothing_to_review(self):
        self.loginUser()
        self.givePermission()
        form = self.getSuggestionForm()
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

    def test_accept_suggestion(self):
        self.loginUser()
        self.givePermission()
        suggestion_id = self.createSuggestion()
        form = self.getSuggestionForm()
        form['accept_reject-{}'.format(suggestion_id)] = 'accept::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object gets created
        media = Media.query().fetch()[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.media_type_enum, MediaType.GRABCAD)
        self.assertEqual(media.year, 2016)
        self.assertListEqual(media.references, [self.team.key])

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

    def test_reject_suggestion(self):
        self.loginUser()
        self.givePermission()
        suggestion_id = self.createSuggestion()
        form = self.getSuggestionForm()
        form['accept_reject-{}'.format(suggestion_id)] = 'reject::{}'.format(
            suggestion_id)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        # Make sure the Media object doesn't get created
        medias = Media.query().fetch(keys_only=True)
        self.assertEqual(len(medias), 0)

        # Make sure we mark the Suggestion as REVIEWED
        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

    def test_fast_path_accept(self):
        self.loginUser()
        self.givePermission()
        suggestion_id = self.createSuggestion()

        response = self.testapp.get(
            '/suggest/cad/review?action=accept&id={}'.format(suggestion_id))
        response = response.follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.GET.get('status'), 'accepted')

        # Make sure the Media object gets created
        media = Media.query().fetch()[0]
        self.assertIsNotNone(media)
        self.assertEqual(media.media_type_enum, MediaType.GRABCAD)
        self.assertEqual(media.year, 2016)
        self.assertListEqual(media.references, [self.team.key])

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_ACCEPTED)

    def test_fast_path_reject(self):
        self.loginUser()
        self.givePermission()
        suggestion_id = self.createSuggestion()

        response = self.testapp.get(
            '/suggest/cad/review?action=reject&id={}'.format(suggestion_id))
        response = response.follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.GET.get('status'), 'rejected')

        medias = Media.query().fetch(keys_only=True)
        self.assertEqual(len(medias), 0)

        suggestion = Suggestion.get_by_id(suggestion_id)
        self.assertIsNotNone(suggestion)
        self.assertEqual(suggestion.review_state, Suggestion.REVIEW_REJECTED)

    def test_fast_path_already_reviewed(self):
        self.loginUser()
        self.givePermission()
        suggestion_id = self.createSuggestion()

        suggestion = Suggestion.get_by_id(suggestion_id)
        suggestion.review_state = Suggestion.REVIEW_ACCEPTED
        suggestion.put()

        response = self.testapp.get(
            '/suggest/cad/review?action=accept&id={}'.format(suggestion_id))
        response = response.follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.GET.get('status'),
                         'already_reviewed')

    def test_fast_path_bad_id(self):
        self.loginUser()
        self.givePermission()
        response = self.testapp.get(
            '/suggest/cad/review?action=accept&id=abc123')
        response = response.follow()
        self.assertEqual(response.status_int, 200)
        self.assertEqual(response.request.GET.get('status'), 'bad_suggestion')
class TestSuggestTeamMediaController(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_user_stub()
        ndb.get_context().clear_cache()  # Prevent data from leaking between tests

        app = webapp2.WSGIApplication([
            RedirectRoute(r'/suggest/team/media', SuggestTeamMediaController, 'suggest-team-media', strict_slash=True),
        ], debug=True)
        self.testapp = webtest.TestApp(app)

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

    def loginUser(self):
        self.testbed.setup_env(
            user_email="*****@*****.**",
            user_id="123",
            user_is_admin='0',
            overwrite=True)

        Account.get_or_insert(
            "123",
            email="*****@*****.**",
            registered=True)

    def storeTeam(self):
        self.team = Team(
            id="frc1124",
            team_number=1124,
        )
        self.team.put()

    def getSuggestionForm(self, team_key, year):
        response = self.testapp.get('/suggest/team/media?team_key={}&year={}'.format(team_key, year))
        self.assertEqual(response.status_int, 200)

        form = response.forms.get('suggest_media', None)
        self.assertIsNotNone(form)
        return form

    def test_login_redirect(self):
        response = self.testapp.get('/suggest/team/media?team_key=frc1124&year=2016', status='3*')
        response = response.follow(expect_errors=True)
        self.assertTrue(response.request.path.startswith("/account/login_required"))

    def test_no_params(self):
        self.loginUser()
        response = self.testapp.get('/suggest/team/media', status='3*')
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, '/')

    def test_submit_empty_form(self):
        self.loginUser()
        self.storeTeam()
        form = self.getSuggestionForm('frc1124', 2016)
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        request = response.request
        self.assertEqual(request.GET.get('status'), 'bad_url')

    def test_bad_team(self):
        self.loginUser()
        response = self.testapp.get('/suggest/team/media?team_key=frc1124&year=2016', status='3*')
        response = response.follow(expect_errors=True)
        self.assertEqual(response.request.path, '/')

    def test_suggest_media(self):
        self.loginUser()
        self.storeTeam()
        form = self.getSuggestionForm('frc1124', 2016)
        form['media_url'] = 'http://imgur.com/aF8T5ZE'
        response = form.submit().follow()
        self.assertEqual(response.status_int, 200)

        request = response.request
        self.assertEqual(request.GET.get('status'), 'success')

        suggestion = Suggestion.get_by_id('media_2016_team_frc1124_imgur_aF8T5ZE')
        self.assertIsNotNone(suggestion)
class TestTeamManipulator(unittest2.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_datastore_v3_stub()
        self.testbed.init_memcache_stub()

        self.old_team = Team(
            id = "frc177",
            team_number = 177,
            first_tpid = 61771,
            first_tpid_year = 2012
        )

        self.new_team = Team(
            id = "frc177",
            team_number = 177,
            website = "http://www.bobcatrobotics.org"
        )
        
    def tearDown(self):
        self.testbed.deactivate()

    def assertMergedTeam(self, team):
        self.assertOldTeam(team)
        self.assertEqual(team.website, "http://www.bobcatrobotics.org")

    def assertOldTeam(self, team):
        self.assertEqual(team.first_tpid, 61771)
        self.assertEqual(team.first_tpid_year, 2012)
        self.assertEqual(team.key_name, "frc177")
        self.assertEqual(team.team_number, 177)

    def test_createOrUpdate(self):
        TeamManipulator.createOrUpdate(self.old_team)
        self.assertOldTeam(Team.get_by_id("frc177"))
        TeamManipulator.createOrUpdate(self.new_team)
        self.assertMergedTeam(Team.get_by_id("frc177"))

    def test_findOrSpawn(self):
        self.old_team.put()
        self.assertMergedTeam(TeamManipulator.findOrSpawn(self.new_team))

    def test_updateMerge(self):
        self.assertMergedTeam(TeamManipulator.updateMerge(self.new_team, self.old_team))

    def test_create_lots_of_teams(self):
        number = 500
        teams = [Team(
            id = "frc%s" % team_number,
            team_number = team_number)
            for team_number in range(number)]
        TeamManipulator.createOrUpdate(teams)

        team = Team.get_by_id("frc177")
        self.assertEqual(team.key_name, "frc177")
        self.assertEqual(team.team_number, 177)

        team = Team.get_by_id("frc%s" % (number - 1))
        self.assertEqual(team.key_name, "frc%s" % (number - 1))
        self.assertEqual(team.team_number, number - 1)
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())