Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions includes/blocks/class-convertkit-block-broadcasts.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ public function register_routes() {

register_rest_route(
'kit/v1',
'/broadcasts/render',
'/broadcasts',
array(
'methods' => WP_REST_Server::CREATABLE,
'methods' => WP_REST_Server::READABLE,
'args' => array(
'date_format' => array(
'default' => $this->get_default_value( 'date_format' ),
Expand Down Expand Up @@ -95,8 +95,7 @@ public function register_routes() {
),
),
'callback' => function ( $request ) {
$html = $this->render_ajax( $request );
return rest_ensure_response( array( 'data' => $html ) );
return rest_ensure_response( $this->render_ajax( $request ) );
},

// No authentication required, as this is on the frontend site.
Expand All @@ -122,7 +121,7 @@ public function enqueue_scripts() {
'convertkit_broadcasts',
array(
// REST API URL endpoint.
'ajax_url' => rest_url( 'kit/v1/broadcasts/render' ),
'ajax_url' => rest_url( 'kit/v1/broadcasts' ),

// Whether debugging is enabled.
'debug' => $settings->debug_enabled(),
Expand Down Expand Up @@ -629,9 +628,21 @@ public function render_ajax( $request ) {
// and moving some attributes (such as Gutenberg's styles), if defined.
$atts = $this->sanitize_and_declare_atts( $atts );

// Setup Settings class.
$settings = new ConvertKit_Settings();

// Fetch Posts.
$posts = new ConvertKit_Resource_Posts( 'output_broadcasts' );

// If no Posts exist, bail.
if ( ! $posts->exist() ) {
if ( $settings->debug_enabled() ) {
return '<!-- ' . __( 'No Broadcasts exist in Kit.', 'convertkit' ) . ' -->';
}

return '';
}

// Build HTML.
$html = $this->build_html( $posts, $atts, false );

Expand Down
14 changes: 6 additions & 8 deletions resources/frontend/js/broadcasts.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,12 @@ function convertKitBroadcastsRender(blockContainer, atts) {
// Show loading indicator.
blockContainer.classList.add('convertkit-broadcasts-loading');

// Build URL with query string parameters.
const params = new URLSearchParams(atts);
const url = `${convertkit_broadcasts.ajax_url}?${params.toString()}`;

// Fetch HTML.
fetch(convertkit_broadcasts.ajax_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams(atts),
})
fetch(url)
.then(function (response) {
if (convertkit_broadcasts.debug) {
console.log(response);
Expand All @@ -82,7 +80,7 @@ function convertKitBroadcastsRender(blockContainer, atts) {
blockContainer.classList.remove('convertkit-broadcasts-loading');

// Replace block container's HTML with response data.
blockContainer.innerHTML = result.data;
blockContainer.innerHTML = result;
})
.catch(function (error) {
if (convertkit.debug) {
Expand Down
107 changes: 107 additions & 0 deletions tests/Integration/RESTAPIBroadcastsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
<?php

namespace Tests;

use lucatume\WPBrowser\TestCase\WPRestApiTestCase;

/**
* Tests for the REST API Broadcasts routes.
*
* @since 3.1.9
*/
class RESTAPIBroadcastsTest extends WPRestApiTestCase
{
/**
* The testing implementation.
*
* @var \IntegrationTester
*/
protected $tester;

/**
* Holds the ConvertKit Settings class.
*
* @since 3.1.9
*
* @var ConvertKit_Settings
*/
private $settings;

/**
* Performs actions before each test.
*
* @since 3.1.9
*/
public function setUp(): void
{
parent::setUp();

// Activate Plugin, to include the Plugin's constants in tests.
activate_plugins('convertkit/wp-convertkit.php');

// Store Credentials in Plugin's settings.
$this->settings = new \ConvertKit_Settings();
$this->settings->save(
array(
'access_token' => $_ENV['CONVERTKIT_OAUTH_ACCESS_TOKEN'],
'refresh_token' => $_ENV['CONVERTKIT_OAUTH_REFRESH_TOKEN'],
'token_expires' => ( time() + 10000 ),
)
);

// Tell WordPress that we're making REST API requests.
// This constant isn't set by the WP_REST_Server class in tests.
if ( ! defined( 'REST_REQUEST' ) ) {
define( 'REST_REQUEST', true );
}
}

/**
* Performs actions after each test.
*
* @since 3.1.9
*/
public function tearDown(): void
{
// Delete Credentials from Plugin's settings.
$this->settings->delete_credentials();
parent::tearDown();
}

/**
* Test that the /wp-json/kit/v1/broadcasts REST API route returns a 200
* with no data when no broadcasts exist.
*
* @since 3.1.9
*/
public function testWhenNoBroadcastsExist()
{
$request = new \WP_REST_Request( 'GET', '/kit/v1/broadcasts' );
$response = rest_get_server()->dispatch( $request );

// Assert response is successful.
$this->assertSame( 200, $response->get_status() );
$this->assertEquals( '', $response->get_data() );
}

/**
* Test that the /wp-json/kit/v1/broadcasts REST API route returns a 200
* with data when broadcasts exist.
*
* @since 3.1.9
*/
public function testWhenBroadcastsExist()
{
// Refresh resources.
$broadcasts = new \ConvertKit_Resource_Posts( 'output_broadcasts' );
$broadcasts->refresh();

// Send request.
$request = new \WP_REST_Request( 'GET', '/kit/v1/broadcasts' );
$response = rest_get_server()->dispatch( $request );

// Assert response is successful.
$this->assertSame( 200, $response->get_status() );
$this->assertNotEmpty( $response->get_data() );
}
}