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)
Example #2
0
    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())
Example #3
0
    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())
Example #4
0
    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())
Example #5
0
    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)
Example #6
0
    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())
Example #7
0
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
Example #8
0
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")
Example #9
0
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))
Example #10
0
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")
Example #11
0
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())