Blame tests/gtestutils.c

Packit 87b8d1
/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8; tab-width: 8 -*-  */
Packit 87b8d1
/*
Packit 87b8d1
 * libgfbgraph - GObject library for Facebook Graph API
Packit 87b8d1
 * Copyright (C) 2013-2015 Álvaro Peña <alvaropg@gmail.com>
Packit 87b8d1
 *
Packit 87b8d1
 * GFBGraph is free software; you can redistribute it and/or
Packit 87b8d1
 * modify it under the terms of the GNU Lesser General Public
Packit 87b8d1
 * License as published by the Free Software Foundation; either
Packit 87b8d1
 * version 2.1 of the License, or (at your option) any later version.
Packit 87b8d1
 *
Packit 87b8d1
 * GFBGraph is distributed in the hope that it will be useful,
Packit 87b8d1
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 87b8d1
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 87b8d1
 * Lesser General Public License for more details.
Packit 87b8d1
 *
Packit 87b8d1
 * You should have received a copy of the GNU Lesser General Public
Packit 87b8d1
 * License along with GFBGraph.  If not, see <http://www.gnu.org/licenses/>.
Packit 87b8d1
 */
Packit 87b8d1
#include <glib.h>
Packit 87b8d1
#include <json-glib/json-glib.h>
Packit 87b8d1
#include <rest/rest-proxy.h>
Packit 87b8d1
#include <string.h>
Packit 87b8d1
Packit 87b8d1
#include <gfbgraph/gfbgraph.h>
Packit 87b8d1
#include <gfbgraph/gfbgraph-simple-authorizer.h>
Packit 87b8d1
Packit 87b8d1
/* #include "config.h" */
Packit 87b8d1
Packit 87b8d1
typedef struct _GFBGraphTestFixture GFBGraphTestFixture;
Packit 87b8d1
typedef struct _GFBGraphTestApp     GFBGraphTestApp;
Packit 87b8d1
Packit 87b8d1
struct _GFBGraphTestFixture
Packit 87b8d1
{
Packit 87b8d1
        gchar *user_id;
Packit 87b8d1
        gchar *user_email;
Packit 87b8d1
Packit 87b8d1
        GFBGraphSimpleAuthorizer *authorizer;
Packit 87b8d1
};
Packit 87b8d1
Packit 87b8d1
struct _GFBGraphTestApp
Packit 87b8d1
{
Packit 87b8d1
        gchar *client_id;
Packit 87b8d1
        gchar *client_secret;
Packit 87b8d1
        gchar *access_token;
Packit 87b8d1
};
Packit 87b8d1
Packit 87b8d1
#define FACEBOOK_ENDPOINT "https://graph.facebook.com/v2.3"
Packit 87b8d1
Packit 87b8d1
#define FACEBOOK_TEST_USER_PERMISSIONS "user_about_me,user_photos,email"
Packit 87b8d1
Packit 87b8d1
GFBGraphTestApp*
Packit 87b8d1
gfbgraph_test_app_setup (void)
Packit 87b8d1
{
Packit 87b8d1
        GFBGraphTestApp *app;
Packit 87b8d1
        RestProxy *proxy;
Packit 87b8d1
        RestProxyCall *rest_call;
Packit 87b8d1
        gchar *function_path;
Packit 87b8d1
        GKeyFile *app_key_file;
Packit 87b8d1
        gchar *app_key_filename;
Packit 87b8d1
        GError *error = NULL;
Packit 87b8d1
        const char *payload;
Packit 87b8d1
        JsonNode *jnode;
Packit 87b8d1
        JsonParser *jparser;
Packit 87b8d1
        JsonReader *jreader;
Packit 87b8d1
Packit 87b8d1
        app_key_filename = g_test_build_filename (G_TEST_BUILT,
Packit 87b8d1
                                                  "credentials.ini",
Packit 87b8d1
                                                  NULL);
Packit 87b8d1
        app_key_file = g_key_file_new ();
Packit 87b8d1
        g_key_file_load_from_file (app_key_file,
Packit 87b8d1
                                   app_key_filename,
Packit 87b8d1
                                   G_KEY_FILE_NONE,
Packit 87b8d1
                                   &error);
Packit 87b8d1
        g_assert_no_error(error);
Packit 87b8d1
Packit 87b8d1
        app = g_new0(GFBGraphTestApp, 1);
Packit 87b8d1
Packit 87b8d1
        app->client_id = g_key_file_get_string (app_key_file,
Packit 87b8d1
                                                "Client",
Packit 87b8d1
                                                "ClientId",
Packit 87b8d1
                                                &error);
Packit 87b8d1
        g_assert_no_error(error);
Packit 87b8d1
        app->client_secret = g_key_file_get_string (app_key_file,
Packit 87b8d1
                                                    "Client",
Packit 87b8d1
                                                    "ClientSecret",
Packit 87b8d1
                                                    &error);
Packit 87b8d1
        g_assert_no_error(error);
Packit 87b8d1
Packit 87b8d1
        proxy = rest_proxy_new (FACEBOOK_ENDPOINT, FALSE);
Packit 87b8d1
        rest_call = rest_proxy_new_call (proxy);
Packit 87b8d1
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "client_id", app->client_id);
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "client_secret", app->client_secret);
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "grant_type", "client_credentials");
Packit 87b8d1
Packit 87b8d1
        rest_proxy_call_set_method (rest_call, "GET");
Packit 87b8d1
        function_path = g_strdup ("/oauth/access_token");
Packit 87b8d1
        rest_proxy_call_set_function (rest_call, function_path);
Packit 87b8d1
Packit 87b8d1
        rest_proxy_call_sync (rest_call, &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
Packit 87b8d1
        payload = rest_proxy_call_get_payload (rest_call);
Packit 87b8d1
        jparser = json_parser_new ();
Packit 87b8d1
        json_parser_load_from_data (jparser, payload, -1, &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
        jnode = json_parser_get_root (jparser);
Packit 87b8d1
        jreader = json_reader_new (jnode);
Packit 87b8d1
        json_reader_read_element (jreader, 0);
Packit 87b8d1
        app->access_token = g_strdup(json_reader_get_string_value (jreader));
Packit 87b8d1
        json_reader_end_element (jreader);
Packit 87b8d1
        g_object_unref(jparser);
Packit 87b8d1
Packit 87b8d1
        g_clear_object(&rest_call);
Packit 87b8d1
        g_clear_object(&proxy);
Packit 87b8d1
Packit 87b8d1
        return app;
Packit 87b8d1
}
Packit 87b8d1
Packit 87b8d1
void
Packit 87b8d1
gfbgraph_test_fixture_setup (GFBGraphTestFixture *fixture, gconstpointer user_data)
Packit 87b8d1
{
Packit 87b8d1
        RestProxy *proxy;
Packit 87b8d1
        RestProxyCall *rest_call;
Packit 87b8d1
        gchar *function_path;
Packit 87b8d1
        const gchar *payload;
Packit 87b8d1
        GError *error = NULL;
Packit 87b8d1
        const GFBGraphTestApp *app = user_data;
Packit 87b8d1
        JsonNode *jnode;
Packit 87b8d1
        JsonParser *jparser;
Packit 87b8d1
        JsonReader *jreader;
Packit 87b8d1
        const gchar *access_token;
Packit 87b8d1
Packit 87b8d1
        /* Create a new user */
Packit 87b8d1
Packit 87b8d1
        proxy = rest_proxy_new (FACEBOOK_ENDPOINT, FALSE);
Packit 87b8d1
        rest_call = rest_proxy_new_call (proxy);
Packit 87b8d1
Packit 87b8d1
        /* Params as documented here: https://developers.facebook.com/docs/graph-api/reference/app/accounts/test-users#publish */
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "installed", "true");
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "permissions", FACEBOOK_TEST_USER_PERMISSIONS);
Packit 87b8d1
        rest_proxy_call_add_param (rest_call, "access_token", app->access_token);
Packit 87b8d1
Packit 87b8d1
        rest_proxy_call_set_method (rest_call, "POST");
Packit 87b8d1
        function_path = g_strdup_printf ("%s/accounts/test-users", app->client_id);
Packit 87b8d1
        rest_proxy_call_set_function (rest_call, function_path);
Packit 87b8d1
Packit 87b8d1
        rest_proxy_call_sync (rest_call, &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
Packit 87b8d1
        payload = rest_proxy_call_get_payload (rest_call);
Packit 87b8d1
        jparser = json_parser_new ();
Packit 87b8d1
        json_parser_load_from_data (jparser, payload, -1, &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
        jnode = json_parser_get_root (jparser);
Packit 87b8d1
        jreader = json_reader_new (jnode);
Packit 87b8d1
Packit 87b8d1
        json_reader_read_element (jreader, 0);
Packit 87b8d1
        fixture->user_id = g_strdup (json_reader_get_string_value (jreader));
Packit 87b8d1
        json_reader_end_element (jreader);
Packit 87b8d1
        json_reader_read_element (jreader, 1);
Packit 87b8d1
        access_token = g_strdup (json_reader_get_string_value (jreader));
Packit 87b8d1
        json_reader_end_element (jreader);
Packit 87b8d1
        json_reader_read_element (jreader, 3);
Packit 87b8d1
        fixture->user_email = g_strdup (json_reader_get_string_value (jreader));
Packit 87b8d1
        json_reader_end_element (jreader);
Packit 87b8d1
Packit 87b8d1
        fixture->authorizer = gfbgraph_simple_authorizer_new (access_token);
Packit 87b8d1
Packit 87b8d1
        if (function_path)
Packit 87b8d1
                g_free (function_path);
Packit 87b8d1
        g_clear_object (&rest_call);
Packit 87b8d1
        g_clear_object (&proxy);
Packit 87b8d1
}
Packit 87b8d1
Packit 87b8d1
static void
Packit 87b8d1
gfbgraph_test_fixture_teardown (GFBGraphTestFixture *fixture, gconstpointer user_data)
Packit 87b8d1
{
Packit 87b8d1
        SoupSession *ssession;
Packit 87b8d1
        SoupMessage *smessage;
Packit 87b8d1
        gchar *function_path;
Packit 87b8d1
        gchar *auth_value;
Packit 87b8d1
        guint status;
Packit 87b8d1
        const GFBGraphTestApp *app = user_data;
Packit 87b8d1
        SoupURI *uri;
Packit 87b8d1
Packit 87b8d1
        /* Delete the test user and clean up memory */
Packit 87b8d1
Packit 87b8d1
        ssession = soup_session_new ();
Packit 87b8d1
Packit 87b8d1
        function_path = g_strdup_printf ("%s/%s", FACEBOOK_ENDPOINT, fixture->user_id);
Packit 87b8d1
        smessage = soup_message_new ("DELETE", function_path);
Packit 87b8d1
        gfbgraph_authorizer_process_message (GFBGRAPH_AUTHORIZER (fixture->authorizer), smessage);
Packit 87b8d1
Packit 87b8d1
        status = soup_session_send_message (ssession, smessage);
Packit 87b8d1
        g_assert_cmpint(status, ==, 200);
Packit 87b8d1
Packit 87b8d1
        g_free (function_path);
Packit 87b8d1
        g_free (auth_value);
Packit 87b8d1
        g_free (fixture->user_id);
Packit 87b8d1
        g_free (fixture->user_email);
Packit 87b8d1
        g_object_unref (fixture->authorizer);
Packit 87b8d1
}
Packit 87b8d1
Packit 87b8d1
static void
Packit 87b8d1
gfbgraph_test_me (GFBGraphTestFixture *fixture, gconstpointer user_data)
Packit 87b8d1
{
Packit 87b8d1
        GFBGraphUser *me;
Packit 87b8d1
        GError *error = NULL;
Packit 87b8d1
Packit 87b8d1
        me = gfbgraph_user_get_me (GFBGRAPH_AUTHORIZER (fixture->authorizer), &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
        g_assert (GFBGRAPH_IS_USER (me));
Packit 87b8d1
Packit 87b8d1
        g_assert_cmpstr (fixture->user_id, ==, gfbgraph_node_get_id (GFBGRAPH_NODE (me)));
Packit 87b8d1
Packit 87b8d1
        g_assert_cmpstr (fixture->user_email, ==, gfbgraph_user_get_email (me));
Packit 87b8d1
Packit 87b8d1
        g_object_unref (me);
Packit 87b8d1
}
Packit 87b8d1
Packit 87b8d1
static void
Packit 87b8d1
gfbgraph_test_album (GFBGraphTestFixture *fixture, gconstpointer user_data)
Packit 87b8d1
{
Packit 87b8d1
        GFBGraphUser *me;
Packit 87b8d1
        GFBGraphAlbum *album;
Packit 87b8d1
        GError *error = NULL;
Packit 87b8d1
Packit 87b8d1
        me = gfbgraph_user_get_me (GFBGRAPH_AUTHORIZER (fixture->authorizer), &error);
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
        g_assert (GFBGRAPH_IS_USER (me));
Packit 87b8d1
Packit 87b8d1
        /* Create a photo album */
Packit 87b8d1
        album = gfbgraph_album_new ();
Packit 87b8d1
        gfbgraph_album_set_name (album, "Vanilla Sky");
Packit 87b8d1
        gfbgraph_album_set_description (album, "Great sunset photos in Mars!");
Packit 87b8d1
        g_assert (gfbgraph_node_append_connection (GFBGRAPH_NODE (me),
Packit 87b8d1
                                                   GFBGRAPH_NODE (album),
Packit 87b8d1
                                                   GFBGRAPH_AUTHORIZER (fixture->authorizer),
Packit 87b8d1
                                                   &error));
Packit 87b8d1
        g_assert_no_error (error);
Packit 87b8d1
}
Packit 87b8d1
Packit 87b8d1
int
Packit 87b8d1
main (int argc, char **argv)
Packit 87b8d1
{
Packit 87b8d1
        GFBGraphTestApp *app = NULL;
Packit 87b8d1
        int test_result;
Packit 87b8d1
Packit 87b8d1
        g_test_init (&argc, &argv, NULL);
Packit 87b8d1
Packit 87b8d1
        g_log_set_always_fatal (G_LOG_LEVEL_ERROR | G_LOG_FLAG_RECURSION | G_LOG_FLAG_FATAL | G_LOG_LEVEL_CRITICAL);
Packit 87b8d1
Packit 87b8d1
        app = gfbgraph_test_app_setup ();
Packit 87b8d1
Packit 87b8d1
        g_test_add ("/GFBGraph/Me",
Packit 87b8d1
                    GFBGraphTestFixture,
Packit 87b8d1
                    app,
Packit 87b8d1
                    gfbgraph_test_fixture_setup,
Packit 87b8d1
                    gfbgraph_test_me,
Packit 87b8d1
                    gfbgraph_test_fixture_teardown);
Packit 87b8d1
Packit 87b8d1
        g_test_add ("/GFBGraph/Album",
Packit 87b8d1
                    GFBGraphTestFixture,
Packit 87b8d1
                    app,
Packit 87b8d1
                    gfbgraph_test_fixture_setup,
Packit 87b8d1
                    gfbgraph_test_album,
Packit 87b8d1
                    gfbgraph_test_fixture_teardown);
Packit 87b8d1
Packit 87b8d1
        test_result = g_test_run ();
Packit 87b8d1
Packit 87b8d1
        if (app) {
Packit 87b8d1
                if (app->client_id)
Packit 87b8d1
                        g_free (app->client_id);
Packit 87b8d1
                if (app->client_secret)
Packit 87b8d1
                        g_free (app->client_secret);
Packit 87b8d1
                if (app->access_token)
Packit 87b8d1
                        g_free (app->access_token);
Packit 87b8d1
        }
Packit 87b8d1
Packit 87b8d1
        return test_result;
Packit 87b8d1
}