def test_overwrite_one_user(self): from test_project.testapp1.facebook_test_users import facebook_test_users self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp1') management.call_command('sync_facebook_test_users', 'testapp1') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) api_test_users = json.loads(requests.get(test_users_url).content)['data'] test_users = _merge_with_facebook_data(facebook_test_users, api_test_users, _get_app_access_token()) # Make sure the test user's information on facebook is correct self.assertEquals(1, len(test_users)) self.assertEquals(1, len([u for u in test_users if u.get('graph_user_data') and u.get('graph_permission_data')])) self.assertEquals(1, len([u for u in api_test_users if 'id' in u and u['id'] == test_users[0]['graph_user_data']['id']])) for permission in test_users[0]['permissions']: self.assertTrue(permission.strip() in test_users[0]['graph_permission_data']['data'][0]) # Make sure the test user's information in facetools is correct self.assertEquals(1, TestUser.objects.count()) user = TestUser.objects.get() self.assertEquals(int(test_users[0]['graph_user_data']['id']), user.facebook_id) self.assertEquals(test_users[0]['graph_user_data']['name'], user.name) self.assertEquals(test_users[0]['graph_user_data']['login_url'], user.login_url) self.assertEquals(test_users[0]['installed'], _has_access_code(user.access_token)) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp1, 'testapp1', facebook_test_users)
def test_fandjango_users_created_correctly(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertTrue(not all([ u['installed'] for u in facebook_test_users ])) # make sure all the users aren't set to have the app installed management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure only the test users that have the app installed have correpsonding Fandjango User records self.assertEquals(2, User.objects.count()) for test_user in test_users: if test_user['installed']: user = User.objects.get( facebook_id=int(test_user['graph_user_data']['id'])) self.assertEquals(test_user['access_token'], user.oauth_token.token) else: self.assertEquals( 0, User.objects.filter(facebook_id=int( test_user['graph_user_data']['id'])).count())
def test_sync_where_in_facebook_and_in_facetools_but_data_not_synced(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure the data looks good self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals( 3, len([u for u in test_users if 'graph_user_data' in u])) # Now change the user data on facetools, leaving them out of sync with the facebook data old_values = {} try: for test_user in TestUser.objects.all(): old_values[test_user.name] = { 'facebook_id': test_user.facebook_id, 'access_token': test_user.access_token } test_user.facebook_id = 0 test_user.access_token = "failbear" test_user.save() # After syncing again the data should be back to normal management.call_command('sync_facebook_test_users', 'testapp3') test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals( 3, len([u for u in test_users if 'graph_user_data' in u])) for test_user in TestUser.objects.all(): self.assertNotEquals(0, test_user.facebook_id) self.assertNotEquals("failbear", test_user.access_token) finally: for test_user in TestUser.objects.all(): test_user.facebook_id = old_values[ test_user.name]['facebook_id'] test_user.access_token = old_values[ test_user.name]['access_token'] test_user.save() # Make sure the generated fixture is correct self.assertTestUserFixture(testapp3, 'testapp3', t3())
def test_sync_all_apps(self): from test_project.testapp1.facebook_test_users import facebook_test_users as t1 from test_project.testapp2.facebook_test_users import facebook_test_users as t2 from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t1 + t2() + t3() self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure each test user's information on facebook is correct self.assertEquals(7, len(test_users)) self.assertEquals( 7, len([ u for u in test_users if 'graph_user_data' in u and 'graph_permission_data' in u ])) for test_user in test_users: for permission in test_user['permissions']: self.assertTrue(permission.strip() in test_user['graph_permission_data']['data'][0]) friends_on_facebook = _get_friends_on_facebook(test_user) for friend_name in test_user.get('friends', []): self.assertTrue(friend_name in friends_on_facebook) self.assertEqual( friends_on_facebook[friend_name], TestUser.objects.get(name=friend_name).facebook_id) # Make sure each test user's information in facetools is correct self.assertEquals(7, TestUser.objects.count()) for user in TestUser.objects.all(): test_user = [ t for t in test_users if int(t['graph_user_data']['id']) == user.facebook_id ][0] self.assertEquals(test_user['name'], user.name) self.assertEquals(test_user['graph_user_data']['login_url'], user.login_url) self.assertEquals(test_user['installed'], _has_access_code(user.access_token)) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp1, 'testapp1', t1) self.assertTestUserFixture(testapp2, 'testapp2', t2()) self.assertTestUserFixture(testapp3, 'testapp3', t3())
def test_overwrite_one_user(self): from test_project.testapp1.facebook_test_users import facebook_test_users self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp1') management.call_command('sync_facebook_test_users', 'testapp1') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) api_test_users = json.loads( requests.get(test_users_url).content)['data'] test_users = _merge_with_facebook_data(facebook_test_users, api_test_users, _get_app_access_token()) # Make sure the test user's information on facebook is correct self.assertEquals(1, len(test_users)) self.assertEquals( 1, len([ u for u in test_users if u.get('graph_user_data') and u.get('graph_permission_data') ])) self.assertEquals( 1, len([ u for u in api_test_users if 'id' in u and u['id'] == test_users[0]['graph_user_data']['id'] ])) for permission in test_users[0]['permissions']: self.assertTrue(permission.strip() in test_users[0] ['graph_permission_data']['data'][0]) # Make sure the test user's information in facetools is correct self.assertEquals(1, TestUser.objects.count()) user = TestUser.objects.get() self.assertEquals(int(test_users[0]['graph_user_data']['id']), user.facebook_id) self.assertEquals(test_users[0]['graph_user_data']['name'], user.name) self.assertEquals(test_users[0]['graph_user_data']['login_url'], user.login_url) self.assertEquals(test_users[0]['installed'], _has_access_code(user.access_token)) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp1, 'testapp1', facebook_test_users)
def test_sync_where_in_facetools_missing_in_facebook(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertTrue(not all([ u['installed'] for u in facebook_test_users ])) # make sure all the users aren't set to have the app installed self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % ( settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure the data looks good self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals( 3, len([u for u in test_users if 'graph_user_data' in u])) # Now remove the users from facebook, leaving them in facetools database for test_user in test_users: _delete_test_user_on_facebook( TestUser.objects.get(name=test_user['name'])) self.assertEquals(3, TestUser.objects.count()) check_users = json.loads(requests.get(test_users_url).content)['data'] old_ids = [u['graph_user_data']['id'] for u in test_users] self.assertTrue(not any([c['id'] in old_ids for c in check_users])) # After syncing again the data should be back to normal management.call_command('sync_facebook_test_users', 'testapp3') test_users = _merge_with_facebook_data( facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals( 3, len([u for u in test_users if 'graph_user_data' in u])) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp3, 'testapp3', t3())
def _get_friends_on_facebook(test_user): friends_url = "https://graph.facebook.com/%s/friends?access_token=%s" % ( test_user['graph_user_data']['id'], _get_app_access_token()) friends_data = json.loads(requests.get(friends_url).content) friends = {} if type(friends_data) is not bool and 'data' in friends_data: for friend in friends_data['data']: friends[friend['name']] = int(friend['id']) assert len(friends) == len(friends_data['data']) return friends
def _create_test_user_on_facebook(app_installed=True, name=None, permissions=None, access_token=None): """ Creates a test user on facebook. Returns a dict of the json response from facebook. """ test_user_template = "https://graph.facebook.com/%s/accounts/test-users?installed=%s&permissions=%s&method=post&access_token=%s" # Generate the request URL if app_installed == True: app_installed = "true" else: app_installed = "false" if permissions is None: permissions = settings.FACEBOOK_APPLICATION_INITIAL_PERMISSIONS permissions = _create_permissions_string(permissions) if access_token is None: access_token = _get_app_access_token() test_user_url = test_user_template % (settings.FACEBOOK_APPLICATION_ID, app_installed, permissions, access_token) if name: test_user_url = '%s&name=%s' % (test_user_url, urllib.quote(name)) # Request a new test user from facebook for attempts in range(3, 0, -1): r = requests.get(test_user_url) try: data = json.loads(r.content) except: data = None if r.status_code != 200 or data is None or data == False or 'error' in data: continue return data else: try: raise CreateTestUserError(data['error']['message']) except CreateTestUserError: raise except: try: raise CreateTestUserError( "Request to create test user failed (status_code=%s and content=\"%s\")" % (r.status_code, r.content)) except CreateTestUserError: raise except: raise CreateTestUserError( "Request to create test user failed (status_code=%s)" % r.status_code) raise CreateTestUserError("Request to create test user failed")
def _delete_test_user_on_facebook(test_user): delete_url_template = "https://graph.facebook.com/%s?method=delete&access_token=%s" delete_user_url = delete_url_template % (test_user.facebook_id, _get_app_access_token()) r = requests.delete(delete_user_url) if not isinstance(r.content, basestring): raise DeleteTestUserError("Error deleting user %s (%s) from facebook: Facebook returned invalid response" % (test_user.name, test_user.facebook_id, r.content)) if r.content.strip().lower() != "true": if r.content.strip().lower() == "false": raise DeleteTestUserError("Error deleting user %s (%s) from facebook: Facebook returned false" % (test_user.name, test_user.facebook_id, r.content)) else: try: raise DeleteTestUserError("Error deleting user %s (%s) from facebook: %s" % (test_user.name, test_user.facebook_id, json.loads(r.content)['error']['message'])) except: raise DeleteTestUserError("Error deleting user %s (%s) from facebook: %s" % (test_user.name, test_user.facebook_id, r.content))
def _create_test_user_on_facebook(app_installed=True, name=None, permissions=None, access_token=None): """ Creates a test user on facebook. Returns a dict of the json response from facebook. """ test_user_template = "https://graph.facebook.com/%s/accounts/test-users?installed=%s&permissions=%s&method=post&access_token=%s" # Generate the request URL if app_installed == True: app_installed = "true" else: app_installed = "false" if permissions is None: permissions = settings.FACEBOOK_APPLICATION_INITIAL_PERMISSIONS permissions = _create_permissions_string(permissions) if access_token is None: access_token = _get_app_access_token() test_user_url = test_user_template % (settings.FACEBOOK_APPLICATION_ID, app_installed, permissions, access_token) if name: test_user_url = '%s&name=%s' % (test_user_url,urllib.quote(name)) # Request a new test user from facebook for attempts in range(3, 0, -1): r = requests.get(test_user_url) try: data = json.loads(r.content) except: data = None if r.status_code != 200 or data is None or data == False or 'error' in data: continue return data else: try: raise CreateTestUserError(data['error']['message']) except CreateTestUserError: raise except: try: raise CreateTestUserError("Request to create test user failed (status_code=%s and content=\"%s\")" % (r.status_code, r.content)) except CreateTestUserError: raise except: raise CreateTestUserError("Request to create test user failed (status_code=%s)" % r.status_code) raise CreateTestUserError("Request to create test user failed")
def _delete_test_user_on_facebook(test_user): delete_url_template = "https://graph.facebook.com/%s?method=delete&access_token=%s" delete_user_url = delete_url_template % (test_user.facebook_id, _get_app_access_token()) r = requests.delete(delete_user_url) if not isinstance(r.content, basestring): raise DeleteTestUserError( "Error deleting user %s (%s) from facebook: Facebook returned invalid response" % (test_user.name, test_user.facebook_id, r.content)) if r.content.strip().lower() != "true": if r.content.strip().lower() == "false": raise DeleteTestUserError( "Error deleting user %s (%s) from facebook: Facebook returned false" % (test_user.name, test_user.facebook_id, r.content)) else: try: raise DeleteTestUserError( "Error deleting user %s (%s) from facebook: %s" % (test_user.name, test_user.facebook_id, json.loads(r.content)['error']['message'])) except: raise DeleteTestUserError( "Error deleting user %s (%s) from facebook: %s" % (test_user.name, test_user.facebook_id, r.content))
def _get_friends_on_facebook(test_user): friends_url = "https://graph.facebook.com/%s/friends?access_token=%s" % (test_user['graph_user_data']['id'], _get_app_access_token()) friends_data = json.loads(requests.get(friends_url).content) friends = {} if type(friends_data) is not bool and 'data' in friends_data: for friend in friends_data['data']: friends[friend['name']] = int(friend['id']) assert len(friends) == len(friends_data['data']) return friends
def test_fandjango_users_created_correctly(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertTrue(not all([u['installed'] for u in facebook_test_users])) # make sure all the users aren't set to have the app installed management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % (settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure only the test users that have the app installed have correpsonding Fandjango User records self.assertEquals(2, User.objects.count()) for test_user in test_users: if test_user['installed']: user = User.objects.get(facebook_id=int(test_user['graph_user_data']['id'])) self.assertEquals(test_user['access_token'], user.oauth_token.token) else: self.assertEquals(0, User.objects.filter(facebook_id=int(test_user['graph_user_data']['id'])).count())
def test_sync_all_apps(self): from test_project.testapp1.facebook_test_users import facebook_test_users as t1 from test_project.testapp2.facebook_test_users import facebook_test_users as t2 from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t1 + t2() + t3() self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % (settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure each test user's information on facebook is correct self.assertEquals(7, len(test_users)) self.assertEquals(7, len([u for u in test_users if 'graph_user_data' in u and 'graph_permission_data' in u])) for test_user in test_users: for permission in test_user['permissions']: self.assertTrue(permission.strip() in test_user['graph_permission_data']['data'][0]) friends_on_facebook = _get_friends_on_facebook(test_user) for friend_name in test_user.get('friends', []): self.assertTrue(friend_name in friends_on_facebook) self.assertEqual(friends_on_facebook[friend_name], TestUser.objects.get(name=friend_name).facebook_id) # Make sure each test user's information in facetools is correct self.assertEquals(7, TestUser.objects.count()) for user in TestUser.objects.all(): test_user = [t for t in test_users if int(t['graph_user_data']['id']) == user.facebook_id][0] self.assertEquals(test_user['name'], user.name) self.assertEquals(test_user['graph_user_data']['login_url'], user.login_url) self.assertEquals(test_user['installed'], _has_access_code(user.access_token)) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp1, 'testapp1', t1) self.assertTestUserFixture(testapp2, 'testapp2', t2()) self.assertTestUserFixture(testapp3, 'testapp3', t3())
def test_sync_where_in_facebook_and_in_facetools_but_data_not_synced(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % (settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure the data looks good self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals(3, len([u for u in test_users if 'graph_user_data' in u])) # Now change the user data on facetools, leaving them out of sync with the facebook data old_values = {} try: for test_user in TestUser.objects.all(): old_values[test_user.name] = { 'facebook_id': test_user.facebook_id, 'access_token': test_user.access_token } test_user.facebook_id = 0 test_user.access_token = "failbear" test_user.save() # After syncing again the data should be back to normal management.call_command('sync_facebook_test_users', 'testapp3') test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals(3, len([u for u in test_users if 'graph_user_data' in u])) for test_user in TestUser.objects.all(): self.assertNotEquals(0, test_user.facebook_id) self.assertNotEquals("failbear", test_user.access_token) finally: for test_user in TestUser.objects.all(): test_user.facebook_id = old_values[test_user.name]['facebook_id'] test_user.access_token = old_values[test_user.name]['access_token'] test_user.save() # Make sure the generated fixture is correct self.assertTestUserFixture(testapp3, 'testapp3', t3())
def test_sync_where_in_facebook_missing_in_facetools(self): from test_project.testapp3.facebook_test_users import facebook_test_users as t3 facebook_test_users = t3() self.assertTrue(not all([u['installed'] for u in facebook_test_users])) # make sure all the users aren't set to have the app installed self.assertEquals(0, TestUser.objects.count()) management.call_command('sync_facebook_test_users', 'testapp3') # Get the test user data from facebook test_users_url = "https://graph.facebook.com/%s/accounts/test-users?access_token=%s" % (settings.FACEBOOK_APPLICATION_ID, _get_app_access_token()) test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) # Make sure the data looks good self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals(3, len([u for u in test_users if 'graph_user_data' in u])) # Now remove the users from facetools, leaving them on facebook TestUser.objects.all().delete() self.assertEquals(0, TestUser.objects.count()) check_users = json.loads(requests.get(test_users_url).content)['data'] old_ids = [u['graph_user_data']['id'] for u in test_users] self.assertEquals(3, len([c for c in check_users if c['id'] in old_ids])) # After syncing again the data should be back to normal management.call_command('sync_facebook_test_users', 'testapp3') test_users = _merge_with_facebook_data(facebook_test_users, json.loads(requests.get(test_users_url).content)['data'], _get_app_access_token()) self.assertEquals(3, TestUser.objects.count()) self.assertEquals(3, len(test_users)) self.assertEquals(3, len([u for u in test_users if 'graph_user_data' in u])) # Make sure the generated fixture is correct self.assertTestUserFixture(testapp3, 'testapp3', t3())