Esempio n. 1
0
    def test_create(self):
        """Anyone can create a team with themselves as captain."""

        # Success.
        user, team_dict = self.create()
        self.assertEqual(team_dict['captain_id'], user.uid)

        fetched_user = User.get_by_id(user.uid)
        self.assertEqual(fetched_user.owned_teams, [team_dict['uid']])

        # Program not found.
        team_params = {'name': 'Team Foo', 'program_id': 'Program_dne'}
        self.testapp.post_json(
            '/api/teams',
            team_params,
            headers=self.login_headers(user),
            status=400,
        )

        # Inactive program.
        inactive_program = Program.create(
            name="Inactive Program",
            label='inactive',
            active=False,
            preview_url='foo.com',
        )
        inactive_program.put()
        self.testapp.post_json(
            '/api/teams',
            dict(team_params, program_id=inactive_program.uid),
            headers=self.login_headers(user),
            status=400,
        )
Esempio n. 2
0
    def test_team_in_program_with_use_cycles_false_gets_single_cycle(self):
        user = User.create(name='foo', email='*****@*****.**')
        user.put()

        cycleless_program = Program.create(
            label='cycleless',
            name='Cycleless Program',
            preview_url='http://cycle.less',
            use_cycles=False,
            min_cycles=1,
            max_cycles=1
        )
        cycleless_program.put()

        cycleless_team_params = {
            "name": 'Cycleless Team',
            "uid": 'Team_cycleless',
            "program_id": cycleless_program.uid
        }
        response = self.testapp.post_json(
            '/api/teams',
            cycleless_team_params,
            headers=self.login_headers(user)
        )

        team_uid = json.loads(response.body)['uid']

        cycles = Cycle.get(team_id=team_uid)

        self.assertEqual(len(cycles), 1)
Esempio n. 3
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestApiNetworks, self).set_up()

        application = webapp2.WSGIApplication(api_routes,
                                              config={
                                                  'webapp2_extras.sessions': {
                                                      'secret_key':
                                                      self.cookie_key
                                                  }
                                              },
                                              debug=True)
        self.testapp = webtest.TestApp(application)

        with mysql_connection.connect() as sql:
            sql.reset({
                'network': Network.get_table_definition(),
                'organization': Organization.get_table_definition(),
                'program': Program.get_table_definition(),
                'user': User.get_table_definition(),
            })

        self.program = Program.create(
            name="Engagement Project",
            label='ep18',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.program.put()
Esempio n. 4
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestApiSurveys, self).set_up()

        application = webapp2.WSGIApplication(api_routes,
                                              config={
                                                  'webapp2_extras.sessions': {
                                                      'secret_key':
                                                      self.cookie_key
                                                  }
                                              },
                                              debug=True)
        self.testapp = webtest.TestApp(application)

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'metric': Metric.get_table_definition(),
                'program': Program.get_table_definition(),
                'survey': Survey.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        self.ep_program = Program.create(
            name="Engagement Project",
            label='ep18',
            active=True,
            preview_url='foo.com',
        )
        self.ep_program.put()
Esempio n. 5
0
    def test_create_for_team(self):
        """Should populate only with metrics active by default."""
        metric1 = Metric.create(name="Community of Helpers",
                                label='community_of_helpers')
        metric1.put()
        metric2 = Metric.create(name="Feedback for Growth",
                                label='feedback_for_growth')
        metric2.put()

        program = Program.create(
            name='Test Program',
            label='test-program',
            metrics=[
                {
                    'uid': metric1.uid,
                    'default_active': True
                },
                {
                    'uid': metric2.uid,
                    'default_active': False
                },
            ],
            preview_url='foo.com',
        )
        program.put()

        team = Team.create(
            captain_id='User_captain',
            program_id=program.uid,
        )

        survey = Survey.create_for_team(team)
        self.assertEqual(survey.metrics, [metric1.uid])
        self.assertEqual(survey.open_responses, [metric1.uid])
        self.assertEqual(survey.meta, {})
Esempio n. 6
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestApiParticipants, self).set_up()

        application = self.patch_webapp(webapp2.WSGIApplication)(
            api_routes,
            config={
                'webapp2_extras.sessions': {
                    'secret_key': self.cookie_key
                }
            },
            debug=True)
        self.testapp = webtest.TestApp(application)

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'cycle': Cycle.get_table_definition(),
                'participant': Participant.get_table_definition(),
                'program': Program.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        self.program = Program.create(
            name="Engagement Project",
            label='ep18',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.program.put()
Esempio n. 7
0
    def test_rserve_skips_existing(self):
        program = Program.create(
            name="The Engagement Project",
            label="ep19",
            preview_url='foo.com',
        )
        week = util.datelike_to_iso_string(datetime.date.today())

        org = Organization.create(name="Organization",
                                  captain_id="User_cap",
                                  program_id=program.uid)
        org_to_skip = Organization.create(name="Organization",
                                          captain_id="User_cap",
                                          program_id=program.uid)
        Organization.put_multi([org, org_to_skip])

        team = Team.create(name="Team",
                           captain_id="User_cap",
                           program_id=program.uid)
        team_to_skip = Team.create(name="Team",
                                   captain_id="User_cap",
                                   program_id=program.uid)
        Team.put_multi([team, team_to_skip])

        cl = Classroom.create(name="Classroom",
                              team_id=team.uid,
                              code="foo",
                              contact_id="User_contact")
        cl_to_skip = Classroom.create(name="Classroom",
                                      team_id=team.uid,
                                      code="foo",
                                      contact_id="User_contact")
        Classroom.put_multi([cl, cl_to_skip])

        Report.put_multi([
            Report.create(parent_id=org_to_skip.uid,
                          filename="foo",
                          issue_date=week),
            Report.create(parent_id=team_to_skip.uid,
                          filename="foo",
                          issue_date=week),
            Report.create(parent_id=cl_to_skip.uid,
                          filename="foo",
                          issue_date=week),
        ])

        # Skips all the parents who have reports already this week.
        orgs, teams, classes = cron_rserve.get_report_parents(
            program, week, False)
        self.assertEqual(len(orgs), 1)
        self.assertEqual(len(teams), 1)
        self.assertEqual(len(classes), 1)

        # ...unless you force it, then they're all there.
        orgs, teams, classes = cron_rserve.get_report_parents(
            program, week, True)
        self.assertEqual(len(orgs), 2)
        self.assertEqual(len(teams), 2)
        self.assertEqual(len(classes), 2)
Esempio n. 8
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestApiTeams, self).set_up()

        application = webapp2.WSGIApplication(
            api_routes,
            config={
                'webapp2_extras.sessions': {
                    'secret_key': self.cookie_key
                }
            },
            debug=True
        )
        self.testapp = webtest.TestApp(application)

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'cycle': Cycle.get_table_definition(),
                'program': Program.get_table_definition(),
                'organization': Organization.get_table_definition(),
                'report': Report.get_table_definition(),
                'survey': Survey.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        # See #848. Remove once resolved.
        self.demo_program = Program.create(
            name="Demo Program",
            label='demoprogram',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.demo_program.put()

        self.ep_program = Program.create(
            name="Engagement Project",
            label='ep19',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.ep_program.put()
Esempio n. 9
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestCron, self).set_up()

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'organization': Organization.get_table_definition(),
                'program': Program.get_table_definition(),
                'report': Report.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        application = webapp2.WSGIApplication(
            cron_routes,
            config={'webapp2_extras.sessions': {
                'secret_key': 'foo'
            }},
            debug=True)
        self.testapp = webtest.TestApp(application)

        self.taskqueue_stub = self.testbed.get_stub(
            testbed.TASKQUEUE_SERVICE_NAME)

        self.ep_program = Program.create(
            name="Engagement Project",
            label='ep19',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.ep_program.put()

        self.beleset_program = Program.create(
            name="Copilot Elevate",
            label='beleset19',
            send_cycle_email=False,
            preview_url='foo.com',
        )
        self.beleset_program.put()
Esempio n. 10
0
    def create(self, program_label):
        program = Program.create(
            name="Foo",
            label=program_label,
            active=True,
            preview_url='foo.com',
        )
        program.put()

        captain = User.create(email='*****@*****.**', name="Captain PERTS")

        team = Team.create(name='Team Foo',
                           program_id=program.uid,
                           captain_id=captain.uid)
        team.put()

        classrooms = [
            Classroom.create(name='Class A',
                             team_id=team.uid,
                             num_students=5,
                             contact_id='User_contact',
                             code='foo'),
            Classroom.create(name='Class B',
                             team_id=team.uid,
                             num_students=5,
                             contact_id='User_contact',
                             code='bar'),
            Classroom.create(name='Class C',
                             team_id=team.uid,
                             num_students=5,
                             contact_id='User_contact',
                             code='baz'),
        ]
        Classroom.put_multi(classrooms)

        survey = Survey.create(team_id=team.uid)
        survey.put()

        captain.owned_teams = [team.uid]
        captain.put()

        start_date = datetime.date.today() - datetime.timedelta(days=7)
        end_date = datetime.date.today() + datetime.timedelta(days=7)
        cycle = Cycle.create(team_id=team.uid,
                             ordinal=1,
                             start_date=start_date,
                             end_date=end_date)
        cycle.put()

        return (program, captain, team, classrooms, cycle)
Esempio n. 11
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestApiReports, self).set_up()

        # Necessary to determine gcs upload bucket name.
        self.testbed.init_app_identity_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_blobstore_stub()

        application = self.patch_webapp(webapp2.WSGIApplication)(
            api_routes,
            config={
                'webapp2_extras.sessions': {
                    'secret_key': self.cookie_key
                }
            },
            debug=True)
        self.testapp = webtest.TestApp(application)

        self.taskqueue_stub = self.testbed.get_stub(
            testbed.TASKQUEUE_SERVICE_NAME)

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'organization': Organization.get_table_definition(),
                'program': Program.get_table_definition(),
                'report': Report.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        if self.valid_jwt is None:
            self.valid_jwt = jwt_helper.encode_rsa({
                'user_id': 'User_rserve',
                'email': '*****@*****.**',
                'user_type': 'super_admin',
            })

        self.program = Program.create(
            name="Engagement Project",
            label='ep18',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.program.put()
Esempio n. 12
0
    def create(self):
        program = Program.create(
            name="Demo",
            label='demo',
            min_cycles=1,
            preview_url='foo.com',
        )
        program.put()

        team = Team.create(name='foo', program_id=program.uid)
        captain = User.create(name='captain', email='*****@*****.**',
                              owned_teams=[team.uid])
        team.captain_id = captain.uid
        teammate = User.create(name='teammate', email='*****@*****.**',
                               owned_teams=[team.uid])
        other = User.create(name='other', email='*****@*****.**')
        User.put_multi((other, teammate, captain))
        team.put()

        cycles = (
            # From a different team.
            Cycle.create(
                team_id='Team_other',
                ordinal=1,
                start_date=datetime.date(2000, 1, 1),
                end_date=datetime.date(2000, 1, 1),
            ),
            Cycle.create(
                team_id=team.uid,
                ordinal=1,
                start_date=datetime.date(2000, 1, 1),
                end_date=datetime.date(2000, 2, 1),
            ),
            # Current.
            Cycle.create(
                team_id=team.uid,
                ordinal=2,
                start_date=datetime.date.today(),
                end_date=datetime.date.today() + datetime.timedelta(weeks=4),
            ),
        )
        Cycle.put_multi(cycles)

        return other, teammate, captain, team, cycles
Esempio n. 13
0
    def test_link_header_for_program(self):
        """Links header should work when filtering to program"""
        program_cset = Program.create(
            name="CSET",
            label="cset19",
            preview_url='foo.com',
        )
        program_cset.put()

        cset_net = Network.create(name="cset Network",
                                  program_id=program_cset.uid)
        cset_net.put()
        ep_nets, super_admin = self.create_for_paging(12)

        # cset only has 1 organization, so no paging past first page.
        response = self.testapp.get(
            '/api/networks?program_id={}&n=10'.format(program_cset.uid),
            headers=self.login_headers(super_admin),
        )

        self.assertEqual(
            response.headers['Link'],
            ('<{path}?program_id={pid}&n=10&order=name>;rel=self,'
             '<{path}?order=name&program_id={pid}&n=10>;rel=first,'
             '<{path}?cursor=0&order=name&program_id={pid}&n=10>;rel=previous,'
             '<{path}?cursor=0&order=name&program_id={pid}&n=10>;rel=next,'
             '<{path}?cursor=0&order=name&program_id={pid}&n=10>;rel=last'
             ).format(path='/api/networks', pid=program_cset.uid))

        # EP has 12 networks, so there is paging past first page.
        response = self.testapp.get(
            '/api/networks?program_id={}&n=10'.format(self.program.uid),
            headers=self.login_headers(super_admin),
        )

        self.assertEqual(
            response.headers['Link'],
            ('<{path}?program_id={pid}&n=10&order=name>;rel=self,'
             '<{path}?order=name&program_id={pid}&n=10>;rel=first,'
             '<{path}?cursor=0&order=name&program_id={pid}&n=10>;rel=previous,'
             '<{path}?cursor=10&order=name&program_id={pid}&n=10>;rel=next,'
             '<{path}?cursor=10&order=name&program_id={pid}&n=10>;rel=last'
             ).format(path='/api/networks', pid=self.program.uid))
Esempio n. 14
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestOrganizations, self).set_up()

        with mysql_connection.connect() as sql:
            sql.reset({
                'organization': Organization.get_table_definition(),
                'program': Program.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        ep_program = Program.create(
            name="Engagement Project",
            label=self.program_label,
            active=True,
            preview_url='foo.com',
        )
        self.ep_program = ep_program
        ep_program.put()
Esempio n. 15
0
    def set_up(self):
        # Let ConsistencyTestCase set up the datastore testing stub.
        super(TestAuth, self).set_up()

        with mysql_connection.connect() as sql:
            sql.reset({
                'classroom': Classroom.get_table_definition(),
                'program': Program.get_table_definition(),
                'team': Team.get_table_definition(),
                'user': User.get_table_definition(),
            })

        self.program = Program.create(
            name="Engagement Project",
            label='ep18',
            min_cycles=3,
            active=True,
            preview_url='foo.com',
        )
        self.program.put()
Esempio n. 16
0
    def test_config_enabled(self):
        program = Program.create(
            name='Program Foo',
            label='TP1',
            survey_config_enabled=True,
            preview_url='foo.com',
        )
        program.put()

        team = Team.create(captain_id='User_captain', program_id=program.uid)
        team.put()

        survey = Survey.create(team_id=team.uid)
        survey.put()

        # Enabled by program.
        self.assertEqual(Survey.config_enabled(survey.uid), True)

        # Disabled by program.
        program.survey_config_enabled = False
        program.put()
        self.assertEqual(Survey.config_enabled(survey.uid), False)
Esempio n. 17
0
    def test_get_owned(self):
        """You can get a team you own."""
        program = Program.create(
            name='Program Foo',
            label='TP1',
            preview_url='foo.com',
        )
        program.put()
        team = Team.create(name='foo', captain_id='User_cap',
                           program_id=program.uid)
        team.put()
        user = User.create(name='foo', email='*****@*****.**',
                           owned_teams=[team.uid])
        user.put()
        classroom = Classroom.create(name='foo', team_id=team.uid,
                                     contact_id=user.uid, code='trout viper')
        classroom.put()

        response = self.testapp.get(
            '/api/teams/{}'.format(team.uid),
            headers=self.login_headers(user),
        )
        response_dict = json.loads(response.body)
        self.assertEqual(response_dict['uid'], team.uid)

        # Should have allowed endpoints for all contained classrooms.
        jwt_payload, error = jwt_helper.decode(
            response.headers['Authorization'][7:])
        self.assertEqual(
            jwt_payload['allowed_endpoints'],
            [
                'GET //neptune/api/project_cohorts/trout-viper/participation',
                # This endpoint is available also b/c the user is the main
                # contact of this classroom.
                'GET //neptune/api/project_cohorts/trout-viper/completion'
            ],
        )
Esempio n. 18
0
    def test_create_with_org_codes(self, org=None):
        """Can send org code(s) on POST to associate with team."""
        other_program = Program.create(
            name='Test Program',
            label='TP1',
            metrics=['Metric_1', 'Metric_2'],
            min_cycles=2,
            active=False,
            preview_url='foo.com',
        )
        other_program.put()
        if org is None:
            org = Organization.create(
                name='Org Correct',
                program_id=self.demo_program.uid,
                code='correct code',
            )
        org2 = Organization.create(
            name='Org Second',
            program_id=self.demo_program.uid,
            code='second code',
        )
        other_org = Organization.create(
            name='Org Other',
            program_id=other_program.uid,
            code='other code',
        )
        Organization.put_multi([org, org2, other_org])
        user = User.create(name='foo', email='*****@*****.**')
        user.put()

        # Invalid org code.
        team_params = {
            'name': 'Team Foo',
            'organization_code': 'does not exist',
            'program_id': self.demo_program.uid,
        }
        self.testapp.post_json(
            '/api/teams',
            team_params,
            headers=self.login_headers(user),
            status=400,
        )

        # Org program and team program don't match.
        self.testapp.post_json(
            '/api/teams',
            dict(team_params, organization_code=other_org.code),
            headers=self.login_headers(user),
            status=400,
        )

        # Success.
        multi_code = ', '.join([org.code, org2.code])
        response = self.testapp.post_json(
            '/api/teams',
            dict(team_params, organization_code=multi_code),
            headers=self.login_headers(user),
        )
        team_dict = json.loads(response.body)

        self.assertEqual(
            set(team_dict['organization_ids']),
            set([org.uid, org2.uid]),
        )
        self.assert_created_with_program(team_dict, self.demo_program)
Esempio n. 19
0
 def test_enforces_that_cycleless_programs_have_one_cycle(self):
     with self.assertRaises(Exception):
         program = Program.create(use_cycles=False,
                                  min_cycles=1,
                                  max_cycles=2)