Testing Moodle Plugins That Send Data to Remote Endpoints
A practical testing guide for Moodle plugins that transmit data to remote endpoints, including fixtures, interception, and repeatable validation.
Purpose
To verify that a Moodle plugin correctly sends data (e.g., grades) to a remote web service (typically via HTTP POST) when specific events are triggered, such as grading an assignment.
Prerequisites
-
Moodle instance with the plugin installed and enabled
-
Access to Moodle server (for grading & logs)
-
PHP CLI available (7.4+)
-
A terminal:
-
Linux/macOS: Bash or Zsh
-
Windows: PowerShell or CMD
-
-
Optional: curl or Postman for manual POSTs
Step-by-Step Procedure
Step 1: Set Up a Fake Local Endpoint
UNIX-like systems (Linux/macOS)
Create a test directory:
mkdir -p ~/php/wstest
cd ~/php/wstest
-
Create a file called index.php:
<?php
ob_start();
echo "=== REQUEST METHOD: " . $_SERVER['REQUEST_METHOD'] . "
===\n";
foreach (getallheaders() as $name => $value) {
echo "$name: $value\n";
}
echo "\n";
$input = file_get_contents('php://input');
echo "=== BODY ===\n";
echo $input . "\n";
$json = json_decode($input, true);
if ($json !== null) {
echo "\n=== PARSED JSON ===\n";
print_r($json);
}
file_put_contents(‘php://stdout’, “=== LOG FROM index.php ===\n” . ob_get_contents() . “\n”);
ob_end_flush();
-
Start the PHP test server:
php -S localhost:8000 -
Keep this terminal open — you’ll see incoming requests printed here.
Windows (for testers)
-
Install PHP
-
Download from https://windows.php.net/
Extract to C:\php Add C:\php to your PATH -
-
Create a test script
Create folder: C:\php\wstest -
Create file: index.php (same contents as above)
Start server in CMD or PowerShell:
cd C:\php\wstest
php -S localhost:8000
Step 2: Point Moodle to the Local Endpoint
In the plugin settings, set the endpoint to your local test server:
http://localhost:8000
-
Ensure your plugin’s event observer is correctly registered. Example (your plugin may differ):
'callback' => '\local_yourplugin\observer::graded' -
Confirm that your observer method exists and is properly namespaced. Example method signature:
public static function graded($eventdata) {
// your handling code
}
Step 3: Trigger the Event
-
Grade an assignment or perform any action that triggers the event
-
Watch your terminal window
Example terminal output:
=== LOG FROM index.php ===
=== REQUEST METHOD: POST ===
Content-Type: application/json
=== BODY ===
{"Cijfer":"77.00000","Cijfertype":"point","OpdrachtID":"15030","GebruikerID":"145404"}
=== PARSED JSON ===
Array
(
[Cijfer] => 77.00000
[Cijfertype] => point
[OpdrachtID] => 15030
[GebruikerID] => 145404
)
Step 4: Debug If Nothing Appears
-
Check that:
-
The plugin is enabled
-
The correct Moodle event is triggered
-
The callback matches your observer class and method
-
Add debug logging with:
Example:
error_log(“Triggered observer::graded()”);
-
Check web server logs
Ensure your curl call includes: Example:
CURLOPT_RETURNTRANSFER => true
Success Criteria
-
Endpoint receives a POST request
-
Data includes expected keys and values
-
No errors are logged in Moodle or PHP logs
Cleanup
-
Press Ctrl+C to stop the test server
-
Revert endpoint configuration if needed
Solin builds and tests Moodle integrations that exchange data with external systems under real operational constraints. Need help? Contact us.
Contact us