Esempio n. 1
0
    def test_too_many_requests(self, mock_requests):
        """Test too many requests."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            status_code=429,
            reason='429 Client Error: Too many requests for url',
        )

        with self.assertRaises(sync_amplitude.TooManyRequestsException):
            sync_amplitude.main([
                '--registered-from', '2017-11-14', '--registered-to',
                '2017-11-18', '--disable-sentry', '--no-dry-run'
            ])
Esempio n. 2
0
    def test_unknown_user(self, mock_requests: requests_mock.Mocker) -> None:
        """Test update_users_client_metrics with an unknown user."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            json={'matches': []})

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry', '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(mock_db.user.find_one({}), user)

        self.assertEqual('Not Found', user.client_metrics.amplitude_id)
Esempio n. 3
0
    def test_missing_sentry(self, unused_mock_requests: requests_mock.Mocker,
                            mock_logging: mock.MagicMock) -> None:
        """Missing sentry env var."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(mock_db.user.find_one({}), user)
        self.assertFalse(user.client_metrics.amplitude_id)

        mock_logging.assert_called_once()
Esempio n. 4
0
    def test_registered_from_days_ago(
            self, mock_requests: requests_mock.Mocker) -> None:
        """Test update_users_client_metrics."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_many([
            {
                '_id': mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
                'registeredAt': '2017-11-17T10:57:12Z',
            },
            # User registered just "today" (the day the script is run).
            {
                '_id': mongomock.ObjectId('7ed900dbfbebd00000000004'),
                'registeredAt': '2017-11-19T10:57:12Z',
            },
        ])
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            json={'matches': [{
                'amplitude_id': 42
            }]})
        mock_requests.get(
            'https://amplitude.com/api/2/useractivity?user=42',
            json={
                'events': [
                    {
                        'event_time': '2017-10-24 10:41:00.412000',
                        'event_properties': {
                            'Mobile Version': True,
                        },
                    },
                    # Last event of the session: 25 min, 5.1 sec later.
                    {
                        'event_time': '2017-10-24 11:06:05.512000'
                    },
                ]
            })

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--disable-sentry',
            '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(
            mock_db.user.find_one({
                '_id':
                mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            }), user)
        self.assertEqual('42', user.client_metrics.amplitude_id)
        self.assertEqual(25 * 60 + 5,
                         user.client_metrics.first_session_duration_seconds)
        self.assertEqual(project_pb2.TRUE,
                         user.client_metrics.is_first_session_mobile)
Esempio n. 5
0
    def test_long_continuous_session(
            self, mock_requests: requests_mock.Mocker) -> None:
        """Test update_users_client_metrics with a user using Bob continuously for an hour."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            json={'matches': [{
                'amplitude_id': 42
            }]})
        mock_requests.get('https://amplitude.com/api/2/useractivity?user=42',
                          json={
                              'events': [
                                  {
                                      'event_time': '2017-10-24 10:40:00'
                                  },
                                  {
                                      'event_time': '2017-10-24 10:45:08'
                                  },
                                  {
                                      'event_time': '2017-10-24 11:06:05'
                                  },
                                  {
                                      'event_time': '2017-10-24 11:26:05'
                                  },
                                  {
                                      'event_time': '2017-10-24 11:46:05'
                                  },
                                  {
                                      'event_time': '2017-10-24 12:05:05'
                                  },
                              ]
                          })

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry', '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(mock_db.user.find_one({}), user)

        self.assertEqual('42', user.client_metrics.amplitude_id)
        self.assertEqual(85 * 60 + 5,
                         user.client_metrics.first_session_duration_seconds)
        self.assertEqual(project_pb2.FALSE,
                         user.client_metrics.is_first_session_mobile)
Esempio n. 6
0
    def test_update_users_client_metrics(
            self, mock_requests: requests_mock.Mocker) -> None:
        """Test update_users_client_metrics."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            json={'matches': [{
                'amplitude_id': 42
            }]})
        mock_requests.get(
            'https://amplitude.com/api/2/useractivity?user=42',
            json={
                'events': [
                    {
                        'event_time': '2017-10-24 10:41:08.396000'
                    },
                    # Event out of order, this one is actually the first of the session.
                    {
                        'event_time': '2017-10-24 10:41:00.412000'
                    },
                    # Last event of the session: 25 min, 5.1 sec later.
                    {
                        'event_time': '2017-10-24 11:06:05.512000'
                    },
                    # Event really later: next session.
                    {
                        'event_time': '2017-10-24 13:06:05'
                    },
                ]
            })

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry', '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(mock_db.user.find_one({}), user)

        self.assertEqual('42', user.client_metrics.amplitude_id)
        self.assertEqual(25 * 60 + 5,
                         user.client_metrics.first_session_duration_seconds)
        self.assertEqual(project_pb2.FALSE,
                         user.client_metrics.is_first_session_mobile)
Esempio n. 7
0
    def test_too_many_requests_but_still_enough(self, mock_requests):
        """Test too many requests but already done more than 200."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_many([{
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2{:03d}'.format(i)),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        } for i in range(400)])
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        # Reply politely to the 300 first.
        for i in range(300):
            mock_requests.get(
                'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2{:03d}'
                .format(i),
                json={'matches': [{
                    'amplitude_id': i
                }]},
            )
            mock_requests.get(
                'https://amplitude.com/api/2/useractivity?user={}'.format(i),
                json={'events': []})
        # Then reply with an error 429.
        for i in range(100):
            mock_requests.get(
                'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2{:03d}'
                .format(i + 300),
                status_code=429,
                reason='429 Client Error: Too many requests for url',
            )

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry', '--no-dry-run'
        ])

        self.assertEqual(
            300,
            len(
                list(
                    mock_db.user.find(
                        {'clientMetrics.amplitudeId': {
                            '$exists': True
                        }}))))
Esempio n. 8
0
    def test_dry_run(self, mock_requests: requests_mock.Mocker,
                     mock_logging: mock.MagicMock) -> None:
        """Test update_users_client_metrics."""

        mock_db = mongomock.MongoClient().test
        mock_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })
        patcher = mock.patch(sync_amplitude.__name__ + '._DB', new=mock_db)
        patcher.start()
        self.addCleanup(patcher.stop)

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            json={'matches': [{
                'amplitude_id': 42
            }]})
        mock_requests.get('https://amplitude.com/api/2/useractivity?user=42',
                          json={
                              'events': [
                                  {
                                      'event_time':
                                      '2017-10-24 10:41:00.412000'
                                  },
                                  {
                                      'event_time':
                                      '2017-10-24 11:06:05.512000'
                                  },
                              ]
                          })

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(mock_db.user.find_one({}), user)

        self.assertFalse(user.client_metrics.amplitude_id)
        self.assertFalse(user.client_metrics.first_session_duration_seconds)
        self.assertFalse(user.client_metrics.is_first_session_mobile)

        mock_logging.assert_called_once()
Esempio n. 9
0
    def test_too_many_requests_but_still_enough(
            self, mock_requests: requests_mock.Mocker) -> None:
        """Test too many requests but already done more than 200."""

        self._user_db.user.insert_many([{
            '_id':
            mongomock.ObjectId(f'7ed900dbfbebdee97f9e2{i:03d}'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        } for i in range(400)])

        # Reply politely to the 300 first.
        for i in range(300):
            mock_requests.get(
                f'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2{i:03d}',
                json={'matches': [{
                    'amplitude_id': i
                }]},
            )
            mock_requests.get(
                f'https://amplitude.com/api/2/useractivity?user={i}',
                json={'events': []})
        # Then reply with an error 429.
        for i in range(100):
            mock_requests.get(
                f'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2{i + 300:03d}',
                status_code=429,
                reason='429 Client Error: Too many requests for url',
            )

        sync_amplitude.main([
            '--registered-from', '2017-11-14', '--registered-to', '2017-11-18',
            '--disable-sentry', '--no-dry-run'
        ])

        self.assertEqual(
            300,
            len(
                list(
                    self._user_db.user.find(
                        {'clientMetrics.amplitudeId': {
                            '$exists': True
                        }}))))
Esempio n. 10
0
    def test_too_many_requests(self,
                               mock_requests: requests_mock.Mocker) -> None:
        """Test too many requests."""

        self._user_db.user.insert_one({
            '_id':
            mongomock.ObjectId('7ed900dbfbebdee97f9e2332'),
            'registeredAt':
            '2017-11-17T10:57:12Z',
        })

        mock_requests.get(
            'https://amplitude.com/api/2/usersearch?user=7ed900dbfbebdee97f9e2332',
            status_code=429,
            reason='429 Client Error: Too many requests for url',
        )

        with self.assertRaises(sync_amplitude.TooManyRequestsException):
            sync_amplitude.main([
                '--registered-from', '2017-11-14', '--registered-to',
                '2017-11-18', '--disable-sentry', '--no-dry-run'
            ])
Esempio n. 11
0
    def test_adding_mobile_afterwards(
            self, mock_requests: requests_mock.Mocker) -> None:
        """Adding the mobile information after already syncing."""

        self._user_db.user.insert_many([
            {
                'registeredAt': '2018-09-03T10:57:12Z',
                'clientMetrics': {
                    'amplitudeId': 'Not Found'
                },
            },
            {
                '_id': mongomock.ObjectId('7ed900dbfbebd00000000004'),
                'registeredAt': '2018-09-03T10:57:12Z',
                'clientMetrics': {
                    'amplitudeId': '1234',
                    'firstSessionDurationSeconds': 5,
                },
            },
            {
                '_id': mongomock.ObjectId('7ed900dbfbebd00000000999'),
                'registeredAt': '2018-09-03T10:58:12Z',
                'clientMetrics': {
                    'amplitudeId': '5678',
                    'firstSessionDurationSeconds': 10,
                },
            },
            {
                'registeredAt': '2018-09-03T10:58:12Z',
                'clientMetrics': {
                    'amplitudeId': 'REDACTED',
                    'firstSessionDurationSeconds': 10,
                },
            },
        ])

        mock_requests.get(
            'https://amplitude.com/api/2/useractivity?user=1234&limit=5',
            json={
                'events': [
                    {
                        'event_time': '2017-10-24 10:41:00.412000',
                        'event_properties': {
                            'Mobile Version': True,
                        },
                    },
                ]
            })
        mock_requests.get(
            'https://amplitude.com/api/2/useractivity?user=5678&limit=5',
            json={'events': []})

        sync_amplitude.main([
            '--registered-from', '2018-08-14', '--registered-to', '2018-09-04',
            '--disable-sentry', '--no-dry-run'
        ])

        user = user_pb2.User()
        proto.parse_from_mongo(
            self._user_db.user.find_one(
                mongomock.ObjectId('7ed900dbfbebd00000000004')), user)
        self.assertEqual('1234', user.client_metrics.amplitude_id)
        self.assertEqual(5, user.client_metrics.first_session_duration_seconds)
        self.assertEqual(boolean_pb2.TRUE,
                         user.client_metrics.is_first_session_mobile)