TASK22211: normalize token endpoint contract handling

This commit is contained in:
2026-03-23 12:24:36 +00:00
parent 8b6ed73508
commit eec59e8e94
2 changed files with 90 additions and 32 deletions
+26 -32
View File
@@ -13,41 +13,35 @@
* description: Success
*/
import axios from "axios";
import { respondError, respondSuccess } from "../middleware/apiResponse";
export default async function ApiProxy(req, res) {
const accessTokenEndpoint = process.env.ACCESS_TOKEN_ENDPOINT;
const tenantId = process.env.TENANT;
const tokenBody =
"grant_type=" +
process.env.GRANT_TYPE +
"&client_id=" +
process.env.CLIENT_ID +
"&client_secret=" +
process.env.CLIENT_SECRET +
"&scope=" +
"https://" +
process.env.RELAYURI +
"/.default";
try {
const accessTokenEndpoint = process.env.ACCESS_TOKEN_ENDPOINT;
const tenantId = process.env.TENANT;
const tokenBody =
"grant_type=" +
process.env.GRANT_TYPE +
"&client_id=" +
process.env.CLIENT_ID +
"&client_secret=" +
process.env.CLIENT_SECRET +
"&scope=" +
"https://" +
process.env.RELAYURI +
"/.default";
var config = {
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Cache-Control": "no-cache",
},
url: `${accessTokenEndpoint}${tenantId}/oauth2/v2.0/token`,
body: tokenBody,
};
const { data } = await axios.post(
`${accessTokenEndpoint}${tenantId}/oauth2/v2.0/token`,
tokenBody
);
console.log("get token case:", config);
return axios
.post(`${accessTokenEndpoint}${tenantId}/oauth2/v2.0/token`, tokenBody)
.then(({ data }) => {
console.log;
res.status(200).json(data);
})
.catch((error) => {
res.status(400);
return respondSuccess(res, data);
} catch (error) {
return respondError(res, {
status: 400,
code: "TOKEN_FETCH_FAILED",
message: "Unable to fetch token"
});
}
}
@@ -3611,6 +3611,70 @@ test("getappealtypesfornewappeal returns success payload contract", async () =>
);
});
test("getToken success returns token payload contract", async () => {
const mod = loadModule("pages/api/endpoint/getToken.js", {
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
axios: {
post: async () => ({
data: {
access_token: "token",
token_type: "Bearer"
}
})
},
process: {
env: {
ACCESS_TOKEN_ENDPOINT: "https://login.microsoftonline.com/",
TENANT: "tenant-id",
GRANT_TYPE: "client_credentials",
CLIENT_ID: "client-id",
CLIENT_SECRET: "secret",
RELAYURI: "relay.example"
}
}
});
const req = { body: {} };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 200);
assert.deepStrictEqual(JSON.parse(JSON.stringify(res.state.jsonBody)), {
access_token: "token",
token_type: "Bearer"
});
});
test("getToken catch path returns TOKEN_FETCH_FAILED", async () => {
const mod = loadModule("pages/api/endpoint/getToken.js", {
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
axios: {
post: async () => {
throw new Error("token fetch failed");
}
},
process: {
env: {
ACCESS_TOKEN_ENDPOINT: "https://login.microsoftonline.com/",
TENANT: "tenant-id",
GRANT_TYPE: "client_credentials",
CLIENT_ID: "client-id",
CLIENT_SECRET: "secret",
RELAYURI: "relay.example"
}
}
});
const req = { body: {} };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(res.state.jsonBody.error.code, "TOKEN_FETCH_FAILED");
});
test("getsipsmedia returns success contract", async () => {
const mod = loadModule("pages/api/endpoint/getsipsmedia_api.js", {
respondSuccess: respondSuccessMock