<?php

use App\Services\Graph\GraphResponse;
use App\Services\Graph\MicrosoftGraphClient;
use GuzzleHttp\Psr7\Response as PsrResponse;
use Illuminate\Http\Client\RequestException as HttpRequestException;
use Illuminate\Http\Client\Response as HttpClientResponse;
use Illuminate\Support\Facades\Http;

it('returns a graph response when the HTTP client throws for a 400 response', function () {
    config()->set('graph.client_id', 'client-id');
    config()->set('graph.client_secret', 'secret');
    config()->set('graph.managed_environment_id', 'tenant-id');

    Http::fake(function () {
        $psrResponse = new PsrResponse(400, [], json_encode([
            'error' => [
                'code' => 'Request_BadRequest',
                'message' => 'One or more added object references already exist for the following modified properties: \'members\'.',
            ],
        ]));

        $response = new HttpClientResponse($psrResponse);

        throw new HttpRequestException($response);
    });

    $client = app(MicrosoftGraphClient::class);

    $response = $client->request('POST', 'groups/group-1/members/$ref', [
        'json' => [
            '@odata.id' => 'https://graph.microsoft.com/v1.0/directoryObjects/sp-1',
        ],
        'access_token' => 'delegated-token',
    ]);

    expect($response)->toBeInstanceOf(GraphResponse::class);
    expect($response->failed())->toBeTrue();
    expect($response->status)->toBe(400);
    expect($response->errors[0]['code'] ?? null)->toBe('Request_BadRequest');
    expect(strtolower($response->errors[0]['message'] ?? ''))->toContain('added object references already exist');
    expect($response->data['error']['message'] ?? null)->toContain('object references already exist');
});
