Skip to main content
Glama
McpPostsToolsTest.php12.1 kB
<?php /** * Test class for McpPostsTools * * @package Automattic\WordpressMcp\Tests\Tools */ namespace Automattic\WordpressMcp\Tests\Tools; use Automattic\WordpressMcp\Core\WpMcp; use Automattic\WordpressMcp\Tools\McpPostsTools; use WP_UnitTestCase; use WP_REST_Request; use WP_User; /** * Test class for McpPostsTools */ final class McpPostsToolsTest extends WP_UnitTestCase { /** * The MCP instance. * * @var WpMcp */ private WpMcp $mcp; /** * The admin user. * * @var WP_User */ private WP_User $admin_user; /** * Set up the test. */ public function set_up(): void { parent::set_up(); // Create an admin user. $this->admin_user = $this->factory->user->create_and_get( array( 'role' => 'administrator', ) ); // Get the MCP instance. $this->mcp = WPMCP(); // Initialize the REST API and MCP. do_action( 'rest_api_init' ); } /** * Test the wp_posts_search tool. */ public function test_wp_posts_search_tool(): void { $this->factory->post->create( array( 'post_title' => 'Test Post', 'post_content' => 'Test Content', 'post_status' => 'publish', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_posts_search', ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); // Get the first post from the response $posts = json_decode( $response->get_data()['content'][0]['text'], true ); $post = $posts[0]; // Assert post data $this->assertEquals( 'Test Post', $post['title']['rendered'] ); $this->assertEquals( '<p>Test Content</p>', trim( $post['content']['rendered'] ) ); $this->assertEquals( 'publish', $post['status'] ); $this->assertEquals( 'post', $post['type'] ); } /** * Test the wp_get_post tool. */ public function test_wp_get_post_tool(): void { // Create a test post. $post_id = $this->factory->post->create( array( 'post_title' => 'Test Post', 'post_content' => 'Test Content', 'post_status' => 'publish', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_get_post', 'arguments' => array( 'id' => $post_id, ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'Test Post', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_add_post tool. */ public function test_wp_add_post_tool(): void { // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_add_post', 'arguments' => array( 'title' => 'New Test Post', 'content' => '<!-- wp:paragraph --><p>New Test Content</p><!-- /wp:paragraph -->', ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'New Test Post', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_update_post tool. */ public function test_wp_update_post_tool(): void { // Create a test post. $post_id = $this->factory->post->create( array( 'post_title' => 'Original Title', 'post_content' => 'Original Content', 'post_status' => 'publish', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_update_post', 'arguments' => array( 'id' => $post_id, 'title' => 'Updated Title', 'content' => '<!-- wp:paragraph --><p>Updated Content</p><!-- /wp:paragraph -->', ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'Updated Title', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_delete_post tool. */ public function test_wp_delete_post_tool(): void { // Create a test post. $post_id = $this->factory->post->create( array( 'post_title' => 'Post to Delete', 'post_content' => 'Content to Delete', 'post_status' => 'publish', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_delete_post', 'arguments' => array( 'id' => $post_id, ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); // Verify the post is deleted. $post = get_post( $post_id ); $this->assertNotNull( $post ); $this->assertEquals( 'trash', $post->post_status ); } /** * Test the wp_list_categories tool. */ public function test_wp_list_categories_tool(): void { // Create a test category. $this->factory->category->create( array( 'name' => 'Test Category', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_list_categories', ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'Test Category', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_add_category tool. */ public function test_wp_add_category_tool(): void { // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_add_category', 'arguments' => array( 'name' => 'New Test Category', ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'New Test Category', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_list_tags tool. */ public function test_wp_list_tags_tool(): void { // Create a test tag. $this->factory->tag->create( array( 'name' => 'Test Tag', ) ); // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_list_tags', ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'Test Tag', $response->get_data()['content'][0]['text'] ); } /** * Test the wp_add_tag tool. */ public function test_wp_add_tag_tool(): void { // Create a REST request. $request = new WP_REST_Request( 'POST', '/wp/v2/wpmcp' ); // Set the request body as JSON. $request->set_body( wp_json_encode( array( 'method' => 'tools/call', 'name' => 'wp_add_tag', 'arguments' => array( 'name' => 'New Test Tag', ), ) ) ); // Set content type header. $request->add_header( 'Content-Type', 'application/json' ); // Set the current user. wp_set_current_user( $this->admin_user->ID ); // Dispatch the request. $response = rest_do_request( $request ); // Check the response. $this->assertEquals( 200, $response->get_status() ); $this->assertArrayHasKey( 'content', $response->get_data() ); $this->assertIsArray( $response->get_data()['content'] ); $this->assertCount( 1, $response->get_data()['content'] ); $this->assertEquals( 'text', $response->get_data()['content'][0]['type'] ); $this->assertStringContainsString( 'New Test Tag', $response->get_data()['content'][0]['text'] ); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Automattic/wordpress-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server