Example #1
0
class AcademyEventTestSuite(EventTestCase):
    cache = EventCache()

    def test_all_academy_events_no_auth(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events')

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail': 'Authentication credentials were not provided.',
            'status_code': 401
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 401)

    def test_all_academy_events_without_capability(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events')
        self.generate_models(authenticate=True)

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail':
            "You (user: 1) don't have this capability: read_event for academy 1",
            'status_code': 403
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 403)

    def test_all_academy_events_wrong_city(self):
        self.headers(academy=1)
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue=True,
                                     event=True)
        url = reverse_lazy('events:academy_all_events') + "?city=patata"

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_correct_city(self):
        self.headers(academy=1)
        venue_kwargs = {"city": "santiago"}
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue_kwargs=venue_kwargs,
                                     venue=True,
                                     event=True)
        url = reverse_lazy('events:academy_all_events') + "?city=santiago"
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'banner':
            model['event'].banner,
            'ending_at':
            datetime_to_iso_format(model['event'].ending_at),
            'event_type':
            model['event'].event_type,
            'excerpt':
            model['event'].excerpt,
            'id':
            model['event'].id,
            'lang':
            model['event'].lang,
            'online_event':
            model['event'].online_event,
            'starting_at':
            datetime_to_iso_format(model['event'].starting_at),
            'status':
            model['event'].status,
            'title':
            model['event'].title,
            'url':
            model['event'].url,
            'venue': {
                'city': model['event'].venue.city,
                'id': model['event'].id,
                'state': model['event'].venue.state,
                'street_address': model['event'].venue.street_address,
                'title': model['event'].venue.title,
                'zip_code': model['event'].venue.zip_code
            }
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_wrong_country(self):
        self.headers(academy=1)
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue=True,
                                     event=True)
        url = reverse_lazy('events:academy_all_events') + "?country=patata"

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_correct_country(self):
        self.headers(academy=1)
        venue_kwargs = {"country": "chile"}
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue_kwargs=venue_kwargs,
                                     venue=True,
                                     event=True)
        url = reverse_lazy('events:academy_all_events') + "?country=chile"
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'banner':
            model['event'].banner,
            'ending_at':
            datetime_to_iso_format(model['event'].ending_at),
            'event_type':
            model['event'].event_type,
            'excerpt':
            model['event'].excerpt,
            'id':
            model['event'].id,
            'lang':
            model['event'].lang,
            'online_event':
            model['event'].online_event,
            'starting_at':
            datetime_to_iso_format(model['event'].starting_at),
            'status':
            model['event'].status,
            'title':
            model['event'].title,
            'url':
            model['event'].url,
            'venue': {
                'city': model['event'].venue.city,
                'id': model['event'].id,
                'state': model['event'].venue.state,
                'street_address': model['event'].venue.street_address,
                'title': model['event'].venue.title,
                'zip_code': model['event'].venue.zip_code
            }
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_wrong_zip_code(self):
        self.headers(academy=1)
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue=True,
                                     event=True)
        url = reverse_lazy(
            'events:academy_all_events') + "?zip_code=12345678965412"

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_correct_zip_code(self):
        self.headers(academy=1)
        venue_kwargs = {"zip_code": "33178"}
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue_kwargs=venue_kwargs,
                                     venue=True,
                                     event=True)
        url = reverse_lazy('events:academy_all_events') + "?zip_code=33178"
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'banner':
            model['event'].banner,
            'ending_at':
            datetime_to_iso_format(model['event'].ending_at),
            'event_type':
            model['event'].event_type,
            'excerpt':
            model['event'].excerpt,
            'id':
            model['event'].id,
            'lang':
            model['event'].lang,
            'online_event':
            model['event'].online_event,
            'starting_at':
            datetime_to_iso_format(model['event'].starting_at),
            'status':
            model['event'].status,
            'title':
            model['event'].title,
            'url':
            model['event'].url,
            'venue': {
                'city': model['event'].venue.city,
                'id': model['event'].id,
                'state': model['event'].venue.state,
                'street_address': model['event'].venue.street_address,
                'title': model['event'].venue.title,
                'zip_code': model['event'].venue.zip_code
            }
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_all_academy_events_upcoming(self):
        self.headers(academy=1)
        event_kwargs = {"starting_at": timezone.now()}
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     venue=True,
                                     event=True,
                                     event_kwargs=event_kwargs)
        url = reverse_lazy('events:academy_all_events') + "?past=true"

        response = self.client.get(url)
        json = response.json()
        expected = [{
            'banner':
            model['event'].banner,
            'ending_at':
            datetime_to_iso_format(model['event'].ending_at),
            'event_type':
            model['event'].event_type,
            'excerpt':
            model['event'].excerpt,
            'id':
            model['event'].id,
            'lang':
            model['event'].lang,
            'online_event':
            model['event'].online_event,
            'starting_at':
            datetime_to_iso_format(model['event'].starting_at),
            'status':
            model['event'].status,
            'title':
            model['event'].title,
            'url':
            model['event'].url,
            'venue': {
                'city': model['event'].venue.city,
                'id': model['event'].id,
                'state': model['event'].venue.state,
                'street_address': model['event'].venue.street_address,
                'title': model['event'].venue.title,
                'zip_code': model['event'].venue.zip_code
            }
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_not_found(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events')
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True)

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events(self, models=None):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events')

        if models is None:
            models = [
                self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)
            ]

        response = self.client.get(url)
        json = response.json()
        expected = [{
            'id':
            model['event'].id,
            'banner':
            model['event'].banner,
            'ending_at':
            datetime_to_iso_format(model['event'].ending_at),
            'event_type':
            model['event'].event_type,
            'excerpt':
            model['event'].excerpt,
            'lang':
            model['event'].lang,
            'online_event':
            model['event'].online_event,
            'starting_at':
            datetime_to_iso_format(model['event'].starting_at),
            'status':
            model['event'].status,
            'title':
            model['event'].title,
            'url':
            model['event'].url,
            'venue':
            model['event'].venue
        } for model in models]

        expected.reverse()

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

        self.assertEqual(self.all_event_dict(), [{
            **self.model_to_dict(model, 'event'),
        } for model in models])
        return models

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_post_without_required_fields(self):
        self.headers(academy=1)

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato')

        url = reverse_lazy('events:academy_all_events')
        data = {}

        response = self.client.post(url, data)
        json = response.json()
        expected = {
            'url': ['This field is required.'],
            'banner': ['This field is required.'],
            'capacity': ['This field is required.'],
            'starting_at': ['This field is required.'],
            'ending_at': ['This field is required.']
        }

        self.assertEqual(json, expected)

        self.assertEqual(self.all_event_dict(), [])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_post_without_required_fields____(self):
        self.headers(academy=1)

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato')

        url = reverse_lazy('events:academy_all_events')
        current_date = self.datetime_now()
        data = {
            'url': 'https://www.google.com/',
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'starting_at': self.datetime_to_iso(current_date),
            'ending_at': self.datetime_to_iso(current_date),
        }

        response = self.client.post(url, data)
        json = response.json()

        self.assertDatetime(json['created_at'])
        self.assertDatetime(json['updated_at'])

        del json['created_at']
        del json['updated_at']

        expected = {
            'academy': 1,
            'author': None,
            'description': None,
            'event_type': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host': None,
            'id': 1,
            'lang': None,
            'online_event': False,
            'organization': None,
            'published_at': None,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'venue': None,
            **data,
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(self.all_event_dict(), [{
            'academy_id': 1,
            'author_id': None,
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'description': None,
            'ending_at': current_date,
            'event_type_id': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host_id': None,
            'id': 1,
            'lang': None,
            'online_event': False,
            'organization_id': None,
            'published_at': None,
            'starting_at': current_date,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'url': 'https://www.google.com/',
            'venue_id': None,
        }])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_pagination(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events')
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)

        base = model.copy()
        del base['event']

        models = [model] + [
            self.generate_models(event=True, models=base)
            for _ in range(0, 105)
        ]
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'id':
            model['event'].id,
            'excerpt':
            model['event'].excerpt,
            'title':
            model['event'].title,
            'lang':
            model['event'].lang,
            'url':
            model['event'].url,
            'banner':
            model['event'].banner,
            'starting_at':
            self.datetime_to_iso(model['event'].starting_at),
            'ending_at':
            self.datetime_to_iso(model['event'].ending_at),
            'status':
            model['event'].status,
            'event_type':
            model['event'].event_type,
            'online_event':
            model['event'].online_event,
            'venue':
            model['event'].venue
        } for model in models]
        expected.sort(key=lambda x: x['starting_at'], reverse=True)
        expected = expected[0:100]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_dict(),
                         [{
                             'academy_id': model['event'].academy_id,
                             'author_id': model['event'].author_id,
                             'banner': model['event'].banner,
                             'capacity': model['event'].capacity,
                             'description': None,
                             'ending_at': model['event'].ending_at,
                             'event_type_id': None,
                             'eventbrite_id': None,
                             'eventbrite_organizer_id': None,
                             'eventbrite_status': None,
                             'eventbrite_url': None,
                             'excerpt': None,
                             'host_id': model['event'].host_id,
                             'id': model['event'].id,
                             'lang': None,
                             'online_event': False,
                             'organization_id': None,
                             'published_at': None,
                             'starting_at': model['event'].starting_at,
                             'status': 'DRAFT',
                             'sync_desc': None,
                             'sync_status': 'PENDING',
                             'title': None,
                             'url': model['event'].url,
                             'venue_id': None
                         } for model in models])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_pagination_first_five(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events') + '?limit=5&offset=0'
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)

        base = model.copy()
        del base['event']

        models = [model] + [
            self.generate_models(event=True, models=base) for _ in range(0, 9)
        ]
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'id':
            model['event'].id,
            'excerpt':
            model['event'].excerpt,
            'title':
            model['event'].title,
            'lang':
            model['event'].lang,
            'url':
            model['event'].url,
            'banner':
            model['event'].banner,
            'starting_at':
            self.datetime_to_iso(model['event'].starting_at),
            'ending_at':
            self.datetime_to_iso(model['event'].ending_at),
            'status':
            model['event'].status,
            'event_type':
            model['event'].event_type,
            'online_event':
            model['event'].online_event,
            'venue':
            model['event'].venue
        } for model in models]
        expected.sort(key=lambda x: x['starting_at'], reverse=True)
        expected = expected[0:5]
        expected = {
            'count': 10,
            'first': None,
            'next':
            'http://testserver/v1/events/academy/event?limit=5&offset=5',
            'previous': None,
            'last':
            'http://testserver/v1/events/academy/event?limit=5&offset=5',
            'results': expected
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_dict(),
                         [{
                             'academy_id': model['event'].academy_id,
                             'author_id': model['event'].author_id,
                             'banner': model['event'].banner,
                             'capacity': model['event'].capacity,
                             'description': None,
                             'ending_at': model['event'].ending_at,
                             'event_type_id': None,
                             'eventbrite_id': None,
                             'eventbrite_organizer_id': None,
                             'eventbrite_status': None,
                             'eventbrite_url': None,
                             'excerpt': None,
                             'host_id': model['event'].host_id,
                             'id': model['event'].id,
                             'lang': None,
                             'online_event': False,
                             'organization_id': None,
                             'published_at': None,
                             'starting_at': model['event'].starting_at,
                             'status': 'DRAFT',
                             'sync_desc': None,
                             'sync_status': 'PENDING',
                             'title': None,
                             'url': model['event'].url,
                             'venue_id': None
                         } for model in models])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_pagination_last_five(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events') + '?limit=5&offset=5'
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)

        base = model.copy()
        del base['event']

        models = [model] + [
            self.generate_models(event=True, models=base) for _ in range(0, 9)
        ]
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'id':
            model['event'].id,
            'excerpt':
            model['event'].excerpt,
            'title':
            model['event'].title,
            'lang':
            model['event'].lang,
            'url':
            model['event'].url,
            'banner':
            model['event'].banner,
            'starting_at':
            self.datetime_to_iso(model['event'].starting_at),
            'ending_at':
            self.datetime_to_iso(model['event'].ending_at),
            'status':
            model['event'].status,
            'event_type':
            model['event'].event_type,
            'online_event':
            model['event'].online_event,
            'venue':
            model['event'].venue
        } for model in models]
        expected.sort(key=lambda x: x['starting_at'], reverse=True)
        expected = expected[5:10]
        expected = {
            'count': 10,
            'first': 'http://testserver/v1/events/academy/event?limit=5',
            'next': None,
            'previous': 'http://testserver/v1/events/academy/event?limit=5',
            'last': None,
            'results': expected
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_dict(),
                         [{
                             'academy_id': model['event'].academy_id,
                             'author_id': model['event'].author_id,
                             'banner': model['event'].banner,
                             'capacity': model['event'].capacity,
                             'description': None,
                             'ending_at': model['event'].ending_at,
                             'event_type_id': None,
                             'eventbrite_id': None,
                             'eventbrite_organizer_id': None,
                             'eventbrite_status': None,
                             'eventbrite_url': None,
                             'excerpt': None,
                             'host_id': model['event'].host_id,
                             'id': model['event'].id,
                             'lang': None,
                             'online_event': False,
                             'organization_id': None,
                             'published_at': None,
                             'starting_at': model['event'].starting_at,
                             'status': 'DRAFT',
                             'sync_desc': None,
                             'sync_status': 'PENDING',
                             'title': None,
                             'url': model['event'].url,
                             'venue_id': None
                         } for model in models])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_pagination_after_last_five(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_all_events') + '?limit=5&offset=10'
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)

        base = model.copy()
        del base['event']

        models = [model] + [
            self.generate_models(event=True, models=base) for _ in range(0, 9)
        ]
        response = self.client.get(url)
        json = response.json()
        expected = {
            'count': 10,
            'first': 'http://testserver/v1/events/academy/event?limit=5',
            'next': None,
            'previous':
            'http://testserver/v1/events/academy/event?limit=5&offset=5',
            'last': None,
            'results': []
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_dict(),
                         [{
                             'academy_id': model['event'].academy_id,
                             'author_id': model['event'].author_id,
                             'banner': model['event'].banner,
                             'capacity': model['event'].capacity,
                             'description': None,
                             'ending_at': model['event'].ending_at,
                             'event_type_id': None,
                             'eventbrite_id': None,
                             'eventbrite_organizer_id': None,
                             'eventbrite_status': None,
                             'eventbrite_url': None,
                             'excerpt': None,
                             'host_id': model['event'].host_id,
                             'id': model['event'].id,
                             'lang': None,
                             'online_event': False,
                             'organization_id': None,
                             'published_at': None,
                             'starting_at': model['event'].starting_at,
                             'status': 'DRAFT',
                             'sync_desc': None,
                             'sync_status': 'PENDING',
                             'title': None,
                             'url': model['event'].url,
                             'venue_id': None
                         } for model in models])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_all_academy_events_with_data_testing_cache(self):
        """Test /cohort without auth"""
        cache_keys = [
            'Event__academy_id=1&event_id=None&city=None&'
            'country=None&zip_code=None&upcoming=None&past=None&limit=None&offset=None'
        ]

        self.assertEqual(self.cache.keys(), [])

        old_models = self.test_all_academy_events()
        self.assertEqual(self.cache.keys(), cache_keys)

        self.test_all_academy_events(old_models)
        self.assertEqual(self.cache.keys(), cache_keys)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_event_type_no_results(self):
        self.headers(academy=1)
        url = reverse_lazy('events:type')
        self.generate_models(authenticate=True)

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_cohort_with_data_testing_cache_and_remove_in_post(self):
        """Test /cohort without auth"""
        cache_keys = [
            'Event__academy_id=1&event_id=None&city=None&'
            'country=None&zip_code=None&upcoming=None&past=None&limit=None&offset=None'
        ]

        self.assertEqual(self.cache.keys(), [])

        old_model = self.test_all_academy_events()
        self.assertEqual(self.cache.keys(), cache_keys)

        self.headers(academy=1)

        base = old_model[0].copy()

        del base['profile_academy']
        del base['capability']
        del base['role']
        del base['user']

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato2',
                                     models=base)

        url = reverse_lazy('events:academy_all_events')
        current_date = self.datetime_now()
        data = {
            'url': 'https://www.google.com/',
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'starting_at': self.datetime_to_iso(current_date),
            'ending_at': self.datetime_to_iso(current_date),
        }

        response = self.client.post(url, data)
        json = response.json()

        self.assertDatetime(json['created_at'])
        self.assertDatetime(json['updated_at'])

        del json['created_at']
        del json['updated_at']

        expected = {
            'academy': 1,
            'author': None,
            'description': None,
            'event_type': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host': None,
            'id': 2,
            'lang': None,
            'online_event': False,
            'organization': None,
            'published_at': None,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'venue': None,
            **data,
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(self.all_event_dict(), [{
            **self.model_to_dict(old_model[0], 'event'),
        }, {
            'academy_id': 1,
            'author_id': None,
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'description': None,
            'ending_at': current_date,
            'event_type_id': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host_id': None,
            'id': 2,
            'lang': None,
            'online_event': False,
            'organization_id': None,
            'published_at': None,
            'starting_at': current_date,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'url': 'https://www.google.com/',
            'venue_id': None,
        }])
        self.assertEqual(self.cache.keys(), [])

        base = [
            self.generate_models(authenticate=True, models=old_model[0]),
            self.generate_models(event=self.get_event(2), models=base),
        ]

        self.test_all_academy_events(base)
        self.assertEqual(self.cache.keys(), cache_keys)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_event_type_with_results(self):
        self.headers(academy=1)
        url = reverse_lazy('events:type')
        event_type_kwargs = {
            "slug": "potato",
            "name": "Potato",
            "created_at": timezone.now(),
            "updated_at": timezone.now()
        }
        model = self.generate_models(authenticate=True,
                                     event=True,
                                     event_type=True,
                                     event_type_kwargs=event_type_kwargs)

        response = self.client.get(url)
        json = response.json()
        expected = [{
            'academy': model['event_type'].academy,
            'id': model['event_type'].id,
            'name': model['event_type'].name,
            'slug': model['event_type'].slug
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

        self.assertEqual(self.all_event_type_dict(), [{
            **self.model_to_dict(model, 'event_type'),
        }])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_event_type_no_match_slug(self):
        self.headers(academy=1)
        url = reverse_lazy('events:type') + '?academy=banana'
        event_type_kwargs = {
            "slug": "potato",
            "name": "Potato",
            "created_at": timezone.now(),
            "updated_at": timezone.now()
        }
        model = self.generate_models(authenticate=True,
                                     event=True,
                                     event_type=True,
                                     event_type_kwargs=event_type_kwargs)

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

        self.assertEqual(self.all_event_type_dict(), [{
            **self.model_to_dict(model, 'event_type'),
        }])
Example #2
0
class AcademyEventView(APIView, HeaderLimitOffsetPagination):
    """
    List all snippets, or create a new snippet.
    """
    cache = EventCache()

    @capable_of('read_event')
    def get(self, request, format=None, academy_id=None, event_id=None):
        city = self.request.GET.get('city')
        country = self.request.GET.get('country')
        zip_code = self.request.GET.get('zip_code')
        upcoming = self.request.GET.get('upcoming')
        past = self.request.GET.get('past')

        cache_kwargs = {
            'academy_id': academy_id,
            'event_id': event_id,
            'city': city,
            'country': country,
            'zip_code': zip_code,
            'upcoming': upcoming,
            'past': past,
            **self.pagination_params(request),
        }

        cache = self.cache.get(**cache_kwargs)
        if cache:
            return Response(cache, status=status.HTTP_200_OK)

        if event_id is not None:
            single_event = Event.objects.filter(
                id=event_id, academy__id=academy_id).first()
            if single_event is None:
                raise ValidationException("Event not found", 404)

            serializer = EventSmallSerializer(single_event, many=False)
            self.cache.set(serializer.data, **cache_kwargs)
            return Response(serializer.data)

        items = Event.objects.filter(academy__id=academy_id)
        lookup = {}

        if city:
            lookup['venue__city__iexact'] = city

        if country:
            lookup['venue__country__iexact'] = country

        if zip_code:
            lookup['venue__zip_code'] = zip_code

        if upcoming:
            lookup['starting_at__gte'] = timezone.now()
        elif past:
            if 'starting_at__gte' in lookup:
                lookup.pop("starting_at__gte")
            if past == "true":
                lookup['starting_at__lte'] = timezone.now()

        items = items.filter(**lookup).order_by('-starting_at')

        page = self.paginate_queryset(items, request)
        serializer = EventSmallSerializerNoAcademy(page, many=True)

        if self.is_paginate(request):
            return self.get_paginated_response(serializer.data,
                                               cache=self.cache,
                                               cache_kwargs=cache_kwargs)
        else:
            self.cache.set(serializer.data, **cache_kwargs)
            return Response(serializer.data, status=200)

    @capable_of('crud_event')
    def post(self, request, format=None, academy_id=None):
        academy = Academy.objects.filter(id=academy_id).first()
        if academy is None:
            raise ValidationException(f"Academy {academy_id} not found")

        data = {}
        for key in request.data.keys():
            data[key] = request.data.get(key)

        serializer = EventSerializer(data={**data, "academy": academy.id})
        if serializer.is_valid():
            self.cache.clear()
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    @capable_of('crud_event')
    def put(self, request, academy_id=None, event_id=None):
        already = Event.objects.filter(id=event_id,
                                       academy__id=academy_id).first()
        if already is None:
            raise ValidationException(
                f"Event not found for this academy {academy_id}")

        serializer = EventSerializer(already, data=request.data)
        if serializer.is_valid():
            self.cache.clear()
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class AcademyEventTestSuite(EventTestCase):
    cache = EventCache()

    def test_academy_checkin_no_auth(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_checkin')

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail': 'Authentication credentials were not provided.',
            'status_code': 401
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 401)

    def test_academy_checkin_without_capability(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_checkin')
        self.generate_models(authenticate=True)

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail':
            "You (user: 1) don't have this capability: read_eventcheckin for academy 1",
            'status_code': 403
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 403)

    def test_academy_checkin_without_data(self):
        self.headers(academy=1)
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_eventcheckin',
                                     role='potato')
        url = reverse_lazy('events:academy_checkin')

        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    def test_academy_checkin_with_bad_academy(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        model = self.generate_models(event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base)
        url = reverse_lazy('events:academy_checkin')
        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin__(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base,
                                     event_checkin_kwargs=event_checkin_kwargs)
        url = reverse_lazy('events:academy_checkin')
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_bad_status(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base)
        url = reverse_lazy('events:academy_checkin') + '?status=DONE'
        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_status(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base,
                                     event_checkin_kwargs=event_checkin_kwargs)
        url = reverse_lazy('events:academy_checkin') + '?status=PENDING'
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_bad_event(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base)
        url = reverse_lazy('events:academy_checkin') + '?event=2'
        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_event(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base,
                                     event_checkin_kwargs=event_checkin_kwargs)
        url = reverse_lazy('events:academy_checkin') + '?event=1'
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_bad_start(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base)
        url = reverse_lazy('events:academy_checkin') + '?start=3000-01-01'
        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_start(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base,
                                     event_checkin_kwargs=event_checkin_kwargs)
        date = model['event_checkin'].created_at
        url = (reverse_lazy('events:academy_checkin') +
               f'?start={date.year}-{date.month}-{date.day}')
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_bad_end(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base)
        url = reverse_lazy('events:academy_checkin') + '?end=1000-01-01'
        response = self.client.get(url)
        json = response.json()
        expected = []

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_with_end(self):
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        model = self.generate_models(event=True,
                                     event_checkin=True,
                                     event_kwargs=event_kwargs,
                                     models=base,
                                     event_checkin_kwargs=event_checkin_kwargs)
        date = model['event_checkin'].updated_at
        url = (reverse_lazy('events:academy_checkin') +
               f'?end={date.year + 1}-{date.month}-{date.day}')
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        }]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        }])

    def test_academy_checkin_pagination_with_105(self):
        """Test /academy/member"""
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        models = [
            self.generate_models(event=True,
                                 event_checkin=True,
                                 event_checkin_kwargs=event_checkin_kwargs,
                                 event_kwargs=event_kwargs,
                                 models=base) for _ in range(0, 105)
        ]
        ordened_models = sorted(models,
                                key=lambda x: x['event_checkin'].created_at,
                                reverse=True)

        url = reverse_lazy('events:academy_checkin')
        response = self.client.get(url)
        json = response.json()
        expected = [{
            'attendee': {
                'first_name': model['event_checkin'].attendee.first_name,
                'id': model['event_checkin'].attendee.id,
                'last_name': model['event_checkin'].attendee.last_name
            },
            'email':
            model['event_checkin'].email,
            'event': {
                'ending_at':
                self.datetime_to_iso(model['event_checkin'].event.ending_at),
                'event_type':
                model['event_checkin'].event.event_type,
                'id':
                model['event_checkin'].event.id,
                'starting_at':
                self.datetime_to_iso(model['event_checkin'].event.starting_at),
                'title':
                model['event_checkin'].event.title
            },
            'id':
            model['event_checkin'].id,
            'status':
            model['event_checkin'].status,
            'created_at':
            self.datetime_to_iso(model['event_checkin'].created_at),
            'attended_at':
            self.datetime_to_iso(model['event_checkin'].attended_at)
        } for model in ordened_models][:100]

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        } for model in models])

    def test_academy_checkin_pagination_first_five(self):
        """Test /academy/member"""
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        models = [
            self.generate_models(event=True,
                                 event_checkin=True,
                                 event_checkin_kwargs=event_checkin_kwargs,
                                 event_kwargs=event_kwargs,
                                 models=base) for _ in range(0, 10)
        ]
        ordened_models = sorted(models,
                                key=lambda x: x['event_checkin'].created_at,
                                reverse=True)

        url = reverse_lazy('events:academy_checkin') + '?limit=5&offset=0'
        response = self.client.get(url)
        json = response.json()
        expected = {
            'count':
            10,
            'first':
            None,
            'last':
            'http://testserver/v1/events/academy/checkin?limit=5&offset=5',
            'next':
            'http://testserver/v1/events/academy/checkin?limit=5&offset=5',
            'previous':
            None,
            'results': [{
                'attendee': {
                    'first_name': model['event_checkin'].attendee.first_name,
                    'id': model['event_checkin'].attendee.id,
                    'last_name': model['event_checkin'].attendee.last_name
                },
                'email':
                model['event_checkin'].email,
                'event': {
                    'ending_at':
                    self.datetime_to_iso(
                        model['event_checkin'].event.ending_at),
                    'event_type':
                    model['event_checkin'].event.event_type,
                    'id':
                    model['event_checkin'].event.id,
                    'starting_at':
                    self.datetime_to_iso(
                        model['event_checkin'].event.starting_at),
                    'title':
                    model['event_checkin'].event.title
                },
                'id':
                model['event_checkin'].id,
                'status':
                model['event_checkin'].status,
                'created_at':
                self.datetime_to_iso(model['event_checkin'].created_at),
                'attended_at':
                self.datetime_to_iso(model['event_checkin'].attended_at)
            } for model in ordened_models][:5]
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        } for model in models])

    def test_academy_checkin_pagination_last_five(self):
        """Test /academy/member"""
        self.headers(academy=1)
        role = 'hitman'
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        event_checkin_kwargs = {'attended_at': self.datetime_now()}
        models = [
            self.generate_models(event=True,
                                 event_checkin=True,
                                 event_checkin_kwargs=event_checkin_kwargs,
                                 event_kwargs=event_kwargs,
                                 models=base) for _ in range(0, 10)
        ]
        ordened_models = sorted(models,
                                key=lambda x: x['event_checkin'].created_at,
                                reverse=True)

        url = reverse_lazy('events:academy_checkin') + '?limit=5&offset=5'
        response = self.client.get(url)
        json = response.json()
        expected = {
            'count':
            10,
            'first':
            'http://testserver/v1/events/academy/checkin?limit=5',
            'last':
            None,
            'next':
            None,
            'previous':
            'http://testserver/v1/events/academy/checkin?limit=5',
            'results': [{
                'attendee': {
                    'first_name': model['event_checkin'].attendee.first_name,
                    'id': model['event_checkin'].attendee.id,
                    'last_name': model['event_checkin'].attendee.last_name
                },
                'email':
                model['event_checkin'].email,
                'event': {
                    'ending_at':
                    self.datetime_to_iso(
                        model['event_checkin'].event.ending_at),
                    'event_type':
                    model['event_checkin'].event.event_type,
                    'id':
                    model['event_checkin'].event.id,
                    'starting_at':
                    self.datetime_to_iso(
                        model['event_checkin'].event.starting_at),
                    'title':
                    model['event_checkin'].event.title
                },
                'id':
                model['event_checkin'].id,
                'status':
                model['event_checkin'].status,
                'created_at':
                self.datetime_to_iso(model['event_checkin'].created_at),
                'attended_at':
                self.datetime_to_iso(model['event_checkin'].attended_at)
            } for model in ordened_models][5:]
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        } for model in models])

    def test_academy_checkin_pagination_after_last_five(self):
        """Test /academy/member"""
        self.headers(academy=1)
        base = self.generate_models(authenticate=True,
                                    profile_academy=True,
                                    capability='read_eventcheckin',
                                    role='potato')

        event_kwargs = {'academy': base['academy']}
        models = [
            self.generate_models(event=True,
                                 event_checkin=True,
                                 event_kwargs=event_kwargs,
                                 models=base) for _ in range(0, 10)
        ]
        url = reverse_lazy('events:academy_checkin') + '?limit=5&offset=10'
        response = self.client.get(url)
        json = response.json()
        expected = {
            'count': 10,
            'first': 'http://testserver/v1/events/academy/checkin?limit=5',
            'last': None,
            'next': None,
            'previous':
            'http://testserver/v1/events/academy/checkin?limit=5&offset=5',
            'results': []
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(self.all_event_checkin_dict(), [{
            **self.model_to_dict(model, 'event_checkin')
        } for model in models])
Example #4
0
class AcademyEventsTestSuite(EventTestCase):
    cache = EventCache()

    def test_academy_single_event_no_auth(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_single_event',
                           kwargs={"event_id": 1})

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail': 'Authentication credentials were not provided.',
            'status_code': 401
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 401)

    def test_all_academy_events_without_capability(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_single_event',
                           kwargs={"event_id": 1})
        self.generate_models(authenticate=True)

        response = self.client.get(url)
        json = response.json()
        expected = {
            'detail':
            "You (user: 1) don't have this capability: read_event for academy 1",
            'status_code': 403
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 403)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_single_event_invalid_id(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_single_event',
                           kwargs={"event_id": 1})
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True)

        response = self.client.get(url)
        json = response.json()
        expected = {'detail': 'Event not found', 'status_code': 404}

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 404)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_single_event_valid_id(self):
        self.headers(academy=1)
        url = reverse_lazy('events:academy_single_event',
                           kwargs={"event_id": 1})
        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='read_event',
                                     role='potato',
                                     syllabus=True,
                                     event=True)

        response = self.client.get(url)
        json = response.json()
        expected = {
            'id': model['event'].id,
            'capacity': model['event'].capacity,
            'description': model['event'].description,
            'excerpt': model['event'].excerpt,
            'title': model['event'].title,
            'lang': model['event'].lang,
            'url': model['event'].url,
            'banner': model['event'].banner,
            'starting_at': datetime_to_iso_format(model['event'].starting_at),
            'ending_at': datetime_to_iso_format(model['event'].ending_at),
            'status': model['event'].status,
            'event_type': model['event'].event_type,
            'online_event': model['event'].online_event,
            'venue': model['event'].venue,
            'academy': {
                'id': 1,
                'slug': model['academy'].slug,
                'name': model['academy'].name,
                'city': {
                    'name': model['event'].academy.city.name
                }
            }
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 200)

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_cohort_id_put_without_required_fields(self):
        """Test /cohort without auth"""
        self.headers(academy=1)

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato2',
                                     event=True)

        url = reverse_lazy('events:academy_single_event',
                           kwargs={'event_id': 1})
        current_date = self.datetime_now()
        data = {
            'id': 1,
        }

        response = self.client.put(url, data)
        json = response.json()

        expected = {
            'url': ['This field is required.'],
            'banner': ['This field is required.'],
            'capacity': ['This field is required.'],
            'starting_at': ['This field is required.'],
            'ending_at': ['This field is required.']
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 400)
        self.assertEqual(self.all_event_dict(), [{
            **self.model_to_dict(model, 'event'),
        }])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_cohort_id_put(self):
        """Test /cohort without auth"""
        self.headers(academy=1)

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato2',
                                     event=True)

        url = reverse_lazy('events:academy_single_event',
                           kwargs={'event_id': 1})
        current_date = self.datetime_now()
        data = {
            'id': 1,
            'url': 'https://www.google.com/',
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'starting_at': self.datetime_to_iso(current_date),
            'ending_at': self.datetime_to_iso(current_date),
        }

        response = self.client.put(url, data)
        json = response.json()

        self.assertDatetime(json['created_at'])
        self.assertDatetime(json['updated_at'])

        del json['created_at']
        del json['updated_at']

        expected = {
            'academy': 1,
            'author': 1,
            'description': None,
            'event_type': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host': 1,
            'id': 2,
            'lang': None,
            'online_event': False,
            'organization': None,
            'published_at': None,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'venue': None,
            **data,
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(self.all_event_dict(),
                         [{
                             **self.model_to_dict(model, 'event'),
                             **data,
                             'starting_at': current_date,
                             'ending_at': current_date,
                         }])

    @patch(GOOGLE_CLOUD_PATH['client'], apply_google_cloud_client_mock())
    @patch(GOOGLE_CLOUD_PATH['bucket'], apply_google_cloud_bucket_mock())
    @patch(GOOGLE_CLOUD_PATH['blob'], apply_google_cloud_blob_mock())
    def test_academy_cohort_with_data_testing_cache_and_remove_in_put(self):
        """Test /cohort without auth"""
        cache_keys = [
            'Event__academy_id=1&event_id=None&city=None&'
            'country=None&zip_code=None&upcoming=None&past=None&limit=None&offset=None'
        ]

        self.assertEqual(self.cache.keys(), [])

        old_model = AcademyEventTestSuite.test_all_academy_events(self)
        self.assertEqual(self.cache.keys(), cache_keys)

        self.headers(academy=1)

        base = old_model[0].copy()

        del base['profile_academy']
        del base['capability']
        del base['role']
        del base['user']

        model = self.generate_models(authenticate=True,
                                     profile_academy=True,
                                     capability='crud_event',
                                     role='potato2',
                                     models=base)

        url = reverse_lazy('events:academy_single_event',
                           kwargs={'event_id': 1})
        current_date = self.datetime_now()
        data = {
            'id': 1,
            'url': 'https://www.google.com/',
            'banner': 'https://www.google.com/banner',
            'capacity': 11,
            'starting_at': self.datetime_to_iso(current_date),
            'ending_at': self.datetime_to_iso(current_date),
        }

        response = self.client.put(url, data)
        json = response.json()

        self.assertDatetime(json['created_at'])
        self.assertDatetime(json['updated_at'])

        del json['created_at']
        del json['updated_at']

        expected = {
            'academy': 1,
            'author': 1,
            'description': None,
            'event_type': None,
            'eventbrite_id': None,
            'eventbrite_organizer_id': None,
            'eventbrite_status': None,
            'eventbrite_url': None,
            'excerpt': None,
            'host': 1,
            'id': 2,
            'lang': None,
            'online_event': False,
            'organization': None,
            'published_at': None,
            'status': 'DRAFT',
            'sync_desc': None,
            'sync_status': 'PENDING',
            'title': None,
            'venue': None,
            **data,
        }

        self.assertEqual(json, expected)
        self.assertEqual(response.status_code, 201)
        self.assertEqual(self.all_event_dict(),
                         [{
                             **self.model_to_dict(model, 'event'),
                             **data,
                             'starting_at': current_date,
                             'ending_at': current_date,
                         }])
        self.assertEqual(self.cache.keys(), [])
        event = old_model[0]['event']

        for x in data:
            setattr(event, x, data[x])

        event.starting_at = current_date
        event.ending_at = current_date
        old_model[0]['event'] = event

        base = [
            self.generate_models(authenticate=True, models=old_model[0]),
        ]

        AcademyEventTestSuite.test_all_academy_events(self, base)
        self.assertEqual(self.cache.keys(), cache_keys)