Files
suaveplan/packages/testkit/testing/testing-integration-oauth-mock/src/shapes/github.ts
2026-05-27 23:47:53 +01:00

62 lines
1.7 KiB
TypeScript

/**
* GitHub-shaped userinfo payload.
*
* Mirrors the documented response of `GET https://api.github.com/user`
* closely enough that Better-Auth / next-auth / passport adapters that
* accept GitHub IdP responses can run unchanged against the mock.
*
* @module
*/
export interface GithubUser {
readonly id: number;
readonly login: string;
readonly email: string;
readonly avatar_url: string;
readonly name: string | null;
readonly node_id: string;
readonly type: "User";
readonly site_admin: boolean;
readonly [key: string]: unknown;
}
export interface PrimedGithubInput {
readonly id?: number | string;
readonly login?: string;
readonly email?: string;
readonly avatar_url?: string;
readonly name?: string | null;
readonly node_id?: string;
readonly site_admin?: boolean;
readonly [key: string]: unknown;
}
export function buildGithubUser(input: PrimedGithubInput = {}): GithubUser {
const id =
input.id === undefined
? 1
: typeof input.id === "string"
? Number.parseInt(input.id, 10) || 0
: input.id;
const login = input.login ?? `mock-user-${id}`;
const email = input.email ?? `${login}@example.test`;
const avatar_url =
input.avatar_url ?? `https://avatars.example.test/${login}.png`;
const name = input.name === undefined ? login : input.name;
const node_id = input.node_id ?? `MDQ6VXNlcjAwMDA${id}`;
const site_admin = input.site_admin ?? false;
const out: GithubUser = {
...input,
id,
login,
email,
avatar_url,
name,
node_id,
type: "User",
site_admin,
};
return Object.freeze(out);
}