def _ValidateUpdateFollowed(self, user_id, viewpoint_id, old_timestamp, new_timestamp): """Validate that an older Followed record was deleted and a newer created.""" if old_timestamp is not None and \ Followed._TruncateToDay(new_timestamp) > Followed._TruncateToDay(old_timestamp): db_key = DBKey(user_id, Followed.CreateSortKey(viewpoint_id, old_timestamp)) self.ValidateDeleteDBObject(Followed, db_key) self.ValidateCreateDBObject(Followed, user_id=user_id, viewpoint_id=viewpoint_id, sort_key=Followed.CreateSortKey(viewpoint_id, new_timestamp), date_updated=Followed._TruncateToDay(new_timestamp))
def _Validate(follower_id, viewpoint_id, last_updated): sort_key = Followed.CreateSortKey(viewpoint_id, last_updated) self._validator.ValidateCreateDBObject(Followed, user_id=follower_id, sort_key=sort_key, date_updated=Followed._TruncateToDay(last_updated), viewpoint_id=viewpoint_id) invalidate = NotificationManager._CreateViewpointInvalidation(viewpoint_id) self._validator.ValidateNotification('dbchk add_followed', follower_id, self._op_dict, invalidate)
def _Validate(viewpoint_id): self._validator.ValidateDeleteDBObject(Follower, DBKey(self._user.user_id, viewpoint_id)) self._validator.ValidateDeleteDBObject(Follower, DBKey(self._user2.user_id, viewpoint_id)) sort_key = Followed.CreateSortKey(viewpoint_id, 0) self._validator.ValidateDeleteDBObject(Followed, DBKey(self._user.user_id, sort_key)) self._validator.ValidateDeleteDBObject(Followed, DBKey(self._user2.user_id, sort_key)) self._validator.ValidateDeleteDBObject(Viewpoint, viewpoint_id)
def _CreateTestViewpoint(self, viewpoint_id, user_id, follower_ids, delete_followed=False): """Create viewpoint_id for testing purposes.""" vp_dict = {'viewpoint_id': viewpoint_id, 'user_id': user_id, 'timestamp': util._TEST_TIME, 'last_updated': util._TEST_TIME, 'type': Viewpoint.EVENT} viewpoint, _ = self._RunAsync(Viewpoint.CreateNewWithFollowers, self._client, follower_ids, **vp_dict) if delete_followed: for f_id in [user_id] + follower_ids: sort_key = Followed.CreateSortKey(viewpoint_id, util._TEST_TIME) followed = self._RunAsync(Followed.Query, self._client, f_id, sort_key, None) self._RunAsync(followed.Delete, self._client) return viewpoint
def testMissingFollowed(self): """Verifies detection and repair of missing Followed records.""" def _Validate(follower_id, viewpoint_id, last_updated): sort_key = Followed.CreateSortKey(viewpoint_id, last_updated) self._validator.ValidateCreateDBObject(Followed, user_id=follower_id, sort_key=sort_key, date_updated=Followed._TruncateToDay(last_updated), viewpoint_id=viewpoint_id) invalidate = NotificationManager._CreateViewpointInvalidation(viewpoint_id) self._validator.ValidateNotification('dbchk add_followed', follower_id, self._op_dict, invalidate) # Remove Followed record from default viewpoint. sort_key = Followed.CreateSortKey(self._user.private_vp_id, util._TEST_TIME) followed = self._RunAsync(Followed.Query, self._client, self._user.user_id, sort_key, None) self._RunAsync(followed.Delete, self._client) # Create non-default viewpoint and change last_updated to "orphan" followed records. viewpoint = self._CreateTestViewpoint('vp1', self._user.user_id, [self._user2.user_id]) viewpoint.last_updated += constants.SECONDS_PER_DAY self._RunAsync(viewpoint.Update, self._client) self._RunAsync(Activity.CreateAddFollowers, self._client, self._user.user_id, 'vp1', 'a1', time.time(), 0, [self._user2.user_id]) self._RunAsync(self._checker.CheckAllViewpoints) # Default viewpoints created by DBBaseTestCase are missing Followed records. corruption_text = \ ' ---- viewpoint v-F- ----\n' \ ' missing followed (1 instance)\n' \ '\n' \ ' ---- viewpoint vp1 ----\n' \ ' missing followed (2 instances)\n' \ '\n' \ 'python dbchk.py --devbox --repair=True --viewpoints=v-F-,vp1' self.assertEqual(self._checker._email_args['text'], 'Found corruption(s) in database:\n\n%s' % corruption_text) self._RunDbChk({'viewpoints': ['vp1', 'v-F-'], 'repair': True}) _Validate(self._user.user_id, 'vp1', util._TEST_TIME) _Validate(self._user.user_id, 'v-F-', util._TEST_TIME)
def _OnDeleteFollower(): Followed.VisitRange(client, options.options.user_id, None, None, _OnQueryFollowed, _DoneQueryFollowed)