portfolio/test/lib/github.spec.ts

344 lines
14 KiB
TypeScript
Raw Normal View History

/**
* @copyright nhcarrigan
* @license Naomi's Public License
* @author Naomi Carrigan
*/
import { describe, it, expect, vi, beforeEach } from "vitest";
import { getGithubData } from "../../src/lib/github";
describe("github", () => {
beforeEach(() => {
vi.resetAllMocks();
});
it("should fetch and cache activities", async() => {
expect.assertions(1);
const mockResponse = [
{
act_user: {
active: true,
avatar_url: "https://example.com/avatar.png",
created: "2023-01-01T00:00:00Z",
description: "Developer",
email: "naomi@example.com",
followers_count: 100,
following_count: 50,
full_name: "Naomi Carrigan",
html_url: "https://example.com",
id: 1,
is_admin: false,
language: "en",
last_login: "2023-01-01T00:00:00Z",
location: "Earth",
login: "naomi",
login_name: "naomi",
prohibit_login: false,
pronouns: "she/her",
restricted: false,
source_id: 1,
starred_repos_count: 10,
username: "naomi",
visibility: "public",
website: "https://example.com",
},
act_user_id: 1,
comment: {
assets: [],
body: "A comment",
created_at: "2023-01-01T00:00:00Z",
html_url: "https://example.com/comment",
id: 1,
issue_url: "https://example.com/issue",
original_author: "naomi",
original_author_id: 1,
pull_request_url: "https://example.com/pr",
updated_at: "2023-01-01T00:00:00Z",
user: null,
},
comment_id: 1,
content: "Activity content",
created: "2023-01-01T00:00:00Z",
id: 1,
is_private: false,
op_type: "create",
ref_name: "main",
repo: {
allow_fast_forward_only_merge: false,
allow_merge_commits: true,
allow_rebase: true,
allow_rebase_explicit: true,
allow_rebase_update: true,
allow_squash_merge: true,
archived: false,
archived_at: "2023-01-01T00:00:00Z",
avatar_url: "https://example.com/avatar.png",
clone_url: "https://example.com/repo.git",
created_at: "2023-01-01T00:00:00Z",
default_allow_maintainer_edit: true,
default_branch: "main",
default_delete_branch_after_merge: true,
default_merge_style: "merge",
description: "A repository",
empty: false,
external_tracker: {
external_tracker_format: "format",
external_tracker_regexp_pattern: "pattern",
external_tracker_style: "style",
external_tracker_url: "https://example.com/tracker",
},
fork: false,
forks_count: 5,
full_name: "naomi/repo",
globally_editable_wiki: false,
has_actions: true,
has_issues: true,
has_packages: true,
has_projects: true,
has_pull_requests: true,
has_releases: true,
has_wiki: true,
html_url: "https://example.com/repo",
id: 1,
ignore_whitespace_conflicts: false,
internal: false,
language: "TypeScript",
languages_url: "https://example.com/languages",
link: "https://example.com/repo",
mirror: false,
mirror_interval: "24h",
mirror_updated: "2023-01-01T00:00:00Z",
name: "repo",
object_format_name: "format",
open_issues_count: 1,
open_pr_counter: 0,
original_url: "https://example.com/repo",
owner: {
active: true,
avatar_url: "https://example.com/avatar.png",
created: "2023-01-01T00:00:00Z",
description: "Developer",
email: "naomi@example.com",
followers_count: 100,
following_count: 50,
full_name: "Naomi Carrigan",
html_url: "https://example.com",
id: 1,
is_admin: false,
language: "en",
last_login: "2023-01-01T00:00:00Z",
location: "Earth",
login: "naomi",
login_name: "naomi",
prohibit_login: false,
pronouns: "she/her",
restricted: false,
source_id: 1,
starred_repos_count: 10,
username: "naomi",
visibility: "public",
website: "https://example.com",
},
parent: null,
permissions: {
admin: true,
pull: true,
push: true,
},
private: false,
release_counter: 0,
repo_transfer: null,
size: 100,
ssh_url: "git@example.com:repo.git",
stars_count: 10,
template: false,
topics: [],
updated_at: "2023-01-01T00:00:00Z",
url: "https://example.com/repo",
watchers_count: 3,
website: "https://example.com",
wiki_branch: "main",
},
repo_id: 1,
user_id: 1,
},
];
vi.spyOn(global, "fetch").mockResolvedValue({
json: () => {
return Promise.resolve(mockResponse);
},
});
const data = await getGithubData();
expect(data, "did not have correct payload").toStrictEqual(mockResponse);
});
it("should return cached data if not stale", async() => {
expect.assertions(3);
const mockResponse = [
{
act_user: {
active: true,
avatar_url: "https://example.com/avatar.png",
created: "2023-01-01T00:00:00Z",
description: "Developer",
email: "naomi@example.com",
followers_count: 100,
following_count: 50,
full_name: "Naomi Carrigan",
html_url: "https://example.com",
id: 1,
is_admin: false,
language: "en",
last_login: "2023-01-01T00:00:00Z",
location: "Earth",
login: "naomi",
login_name: "naomi",
prohibit_login: false,
pronouns: "she/her",
restricted: false,
source_id: 1,
starred_repos_count: 10,
username: "naomi",
visibility: "public",
website: "https://example.com",
},
act_user_id: 1,
comment: {
assets: [],
body: "A comment",
created_at: "2023-01-01T00:00:00Z",
html_url: "https://example.com/comment",
id: 1,
issue_url: "https://example.com/issue",
original_author: "naomi",
original_author_id: 1,
pull_request_url: "https://example.com/pr",
updated_at: "2023-01-01T00:00:00Z",
user: null,
},
comment_id: 1,
content: "Activity content",
created: "2023-01-01T00:00:00Z",
id: 1,
is_private: false,
op_type: "create",
ref_name: "main",
repo: {
allow_fast_forward_only_merge: false,
allow_merge_commits: true,
allow_rebase: true,
allow_rebase_explicit: true,
allow_rebase_update: true,
allow_squash_merge: true,
archived: false,
archived_at: "2023-01-01T00:00:00Z",
avatar_url: "https://example.com/avatar.png",
clone_url: "https://example.com/repo.git",
created_at: "2023-01-01T00:00:00Z",
default_allow_maintainer_edit: true,
default_branch: "main",
default_delete_branch_after_merge: true,
default_merge_style: "merge",
description: "A repository",
empty: false,
external_tracker: {
external_tracker_format: "format",
external_tracker_regexp_pattern: "pattern",
external_tracker_style: "style",
external_tracker_url: "https://example.com/tracker",
},
fork: false,
forks_count: 5,
full_name: "naomi/repo",
globally_editable_wiki: false,
has_actions: true,
has_issues: true,
has_packages: true,
has_projects: true,
has_pull_requests: true,
has_releases: true,
has_wiki: true,
html_url: "https://example.com/repo",
id: 1,
ignore_whitespace_conflicts: false,
internal: false,
language: "TypeScript",
languages_url: "https://example.com/languages",
link: "https://example.com/repo",
mirror: false,
mirror_interval: "24h",
mirror_updated: "2023-01-01T00:00:00Z",
name: "repo",
object_format_name: "format",
open_issues_count: 1,
open_pr_counter: 0,
original_url: "https://example.com/repo",
owner: {
active: true,
avatar_url: "https://example.com/avatar.png",
created: "2023-01-01T00:00:00Z",
description: "Developer",
email: "naomi@example.com",
followers_count: 100,
following_count: 50,
full_name: "Naomi Carrigan",
html_url: "https://example.com",
id: 1,
is_admin: false,
language: "en",
last_login: "2023-01-01T00:00:00Z",
location: "Earth",
login: "naomi",
login_name: "naomi",
prohibit_login: false,
pronouns: "she/her",
restricted: false,
source_id: 1,
starred_repos_count: 10,
username: "naomi",
visibility: "public",
website: "https://example.com",
},
parent: null,
permissions: {
admin: true,
pull: true,
push: true,
},
private: false,
release_counter: 0,
repo_transfer: null,
size: 100,
ssh_url: "git@example.com:repo.git",
stars_count: 10,
template: false,
topics: [],
updated_at: "2023-01-01T00:00:00Z",
url: "https://example.com/repo",
watchers_count: 3,
website: "https://example.com",
wiki_branch: "main",
},
repo_id: 1,
user_id: 1,
},
];
vi.spyOn(global, "fetch").mockResolvedValue({
json: () => {
return Promise.resolve(mockResponse);
},
});
const data = await getGithubData();
expect(data, "did not have correct payload").toStrictEqual(mockResponse);
// Call again to check if cached data is returned
const cachedData = await getGithubData();
expect(cachedData, "did not cache correct payload").
toStrictEqual(mockResponse);
expect(global.fetch, "did not hit cache").not.toHaveBeenCalled();
});
});