PHPackages                             qoliber/servermock - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. qoliber/servermock

ActiveLibrary[Testing &amp; Quality](/categories/testing)

qoliber/servermock
==================

Embedded HTTP mock server for PHP integration tests

v1.0.0(4mo ago)262—0%1MITPHPPHP ^8.1

Since Jan 9Pushed 4mo agoCompare

[ Source](https://github.com/qoliber/servermock)[ Packagist](https://packagist.org/packages/qoliber/servermock)[ RSS](/packages/qoliber-servermock/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (7)Versions (2)Used By (0)

ServerMock
==========

[](#servermock)

An embedded HTTP mock server for PHP integration tests. Inspired by Rust's `wiremock` crate and similar to WireMock, but runs entirely in PHP with no Docker or JVM required.

Installation
------------

[](#installation)

```
composer require --dev qoliber/servermock
```

Quick Start
-----------

[](#quick-start)

```
use Qoliber\ServerMock\Mock;
use Qoliber\ServerMock\MockServer;

// Start a mock server on a random port
$server = MockServer::start();

// Define a stub
Mock::get('/api/users/1')
    ->respondJson(['id' => 1, 'name' => 'John Doe'])
    ->mount($server);

// Make requests against it
$response = file_get_contents($server->url('/api/users/1'));
// Returns: {"id":1,"name":"John Doe"}

// Clean up
$server->shutdown();
```

Bulk Configuration
------------------

[](#bulk-configuration)

Configure multiple stubs at once - great for complex test scenarios:

```
$server->configure([
    Mock::get('/api/users')->respondJson(['users' => []]),
    Mock::get('/api/products')->respondJson(['products' => ['SKU001']]),
    Mock::post('/api/orders')->respondJson(['orderId' => '12345'], 201),
]);
```

Scenarios
---------

[](#scenarios)

Create reusable test scenarios:

```
use Qoliber\ServerMock\Scenario;

$checkoutScenario = Scenario::create('checkout')
    ->stub(Mock::get('/api/cart')->respondJson(['items' => [], 'total' => 0]))
    ->stub(Mock::post('/api/cart/add')->respondJson(['success' => true]))
    ->stub(Mock::post('/api/checkout')->respondJson(['orderId' => 'ORD-001']));

$server->applyScenario($checkoutScenario);
```

Or use the fluent API:

```
$scenario = Scenario::create('user-flow');
$scenario->get('/api/profile')->respondJson(['name' => 'John']);
$scenario->post('/api/update')->respondJson(['updated' => true]);
$scenario->applyTo($server);
```

Load Configuration from Files
-----------------------------

[](#load-configuration-from-files)

Auto-detect format by extension:

```
$server->loadFromFile('fixtures/api-stubs.yaml');  // Auto-detects YAML
$server->loadFromFile('fixtures/api-stubs.json');  // Auto-detects JSON
```

### JSON

[](#json)

```
$server->loadFromJson('fixtures/stubs.json');
```

```
{
  "stubs": [
    {
      "method": "GET",
      "path": "/api/users",
      "response": { "status": 200, "body": "{\"users\": []}" }
    }
  ]
}
```

### YAML (requires `symfony/yaml`)

[](#yaml-requires-symfonyyaml)

```
composer require symfony/yaml
```

```
$server->loadFromYaml('fixtures/stubs.yaml');
```

```
# fixtures/stubs.yaml
stubs:
  - method: GET
    path: /api/users
    response:
      status: 200
      body: '{"users": []}'

  - method: POST
    path: /api/orders
    headers:
      Content-Type: application/json
    response:
      status: 201
      body: '{"orderId": "123"}'

  - method: GET
    pathRegex: '#^/api/products/\d+$#'
    response:
      body: '{"id": "matched"}'
```

### TOML (requires `yosymfony/toml`)

[](#toml-requires-yosymfonytoml)

```
composer require yosymfony/toml
```

```
$server->loadFromToml('fixtures/stubs.toml');
```

```
# fixtures/stubs.toml
[[stubs]]
method = "GET"
path = "/api/users"

[stubs.response]
status = 200
body = '{"users": []}'

[[stubs]]
method = "POST"
path = "/api/orders"

[stubs.response]
status = 201
body = '{"orderId": "123"}'
```

### PHP (native, supports dynamic values)

[](#php-native-supports-dynamic-values)

```
$server->loadFromPhp('fixtures/stubs.php');
```

```
