import assert from 'node:assert/strict';
import test from 'node:test';
import {EntraClientSecretTokenProvider} from './auth.js';

test('Entra authentication uses client secret credentials', async () => {
    let requestedUrl = '';
    let requestedBody = '';
    const fetchImpl = (async (input: string | URL | Request, init?: RequestInit) => {
        requestedUrl = String(input);
        requestedBody = String(init?.body);
        return new Response(
            JSON.stringify({access_token: 'graph-token', expires_in: 3600}),
            {
                status: 200,
                headers: {'Content-Type': 'application/json'},
            },
        );
    }) as typeof fetch;

    const provider = new EntraClientSecretTokenProvider(
        'tenant-id',
        'client-id',
        'client-secret',
        fetchImpl,
    );

    const token = await provider.getToken();
    const form = new URLSearchParams(requestedBody);

    assert.equal(
        requestedUrl,
        'https://login.microsoftonline.com/tenant-id/oauth2/v2.0/token',
    );
    assert.equal(form.get('grant_type'), 'client_credentials');
    assert.equal(form.get('client_id'), 'client-id');
    assert.equal(form.get('client_secret'), 'client-secret');
    assert.equal(form.get('scope'), 'https://graph.microsoft.com/.default');
    assert.equal(form.has('client_assertion'), false);
    assert.equal(token.accessToken, 'graph-token');
});
