Skip to content
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
8 changes: 4 additions & 4 deletions resources/frontend/js/restrict-content.js
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,10 @@ function convertKitRestrictContentSubscriberAuthenticationSendCode(
fetch(convertkit_restrict_content.subscriber_authentication_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Type': 'application/json',
'X-WP-Nonce': nonce,
},
body: new URLSearchParams({
body: JSON.stringify({
convertkit_email: email,
convertkit_resource_type: resource_type,
convertkit_resource_id: resource_id,
Expand Down Expand Up @@ -223,10 +223,10 @@ function convertKitRestrictContentSubscriberVerification(
fetch(convertkit_restrict_content.subscriber_verification_url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Type': 'application/json',
'X-WP-Nonce': nonce,
},
body: new URLSearchParams({
body: JSON.stringify({
subscriber_code,
token,
convertkit_post_id: post_id,
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() );
}
}
Loading