187 lines
6.2 KiB
TypeScript
187 lines
6.2 KiB
TypeScript
import { expect, tap } from '@push.rocks/tapbundle';
|
|
import * as qenv from '@push.rocks/qenv';
|
|
const testQenv = new qenv.Qenv('./', './.nogit/');
|
|
|
|
import * as ghost from '../ts/index.js';
|
|
|
|
// make sure we can import the IPost type
|
|
import {type IPost} from '../ts/index.js';
|
|
|
|
let testGhostInstance: ghost.Ghost;
|
|
|
|
tap.test('should create a valid instance of Ghost', async () => {
|
|
testGhostInstance = new ghost.Ghost({
|
|
baseUrl: 'http://localhost:2368',
|
|
adminApiKey: await testQenv.getEnvVarOnDemand('ADMIN_APIKEY'),
|
|
contentApiKey: await testQenv.getEnvVarOnDemand('CONTENT_APIKEY'),
|
|
});
|
|
expect(testGhostInstance).toBeInstanceOf(ghost.Ghost);
|
|
});
|
|
|
|
tap.test('should get posts', async () => {
|
|
const posts = await testGhostInstance.getPosts();
|
|
expect(posts).toBeArray();
|
|
expect(posts[0]).toBeInstanceOf(ghost.Post);
|
|
console.log(JSON.stringify(posts[0].postData, null, 2));
|
|
posts.map((post) => {
|
|
// console.log(JSON.stringify(post.postData, null, 2));
|
|
console.log(`-> ${post.getTitle()}`);
|
|
console.log(`by ${post.getAuthor().name}`)
|
|
console.log(post.getExcerpt());
|
|
console.log(`===============`)
|
|
})
|
|
|
|
})
|
|
|
|
tap.test('should get all tags', async () => {
|
|
const tags = await testGhostInstance.getTags();
|
|
expect(tags).toBeArray();
|
|
console.log(`Found ${tags.length} tags:`);
|
|
tags.forEach((tag) => {
|
|
console.log(`-> ${tag.name} (${tag.slug})`);
|
|
});
|
|
});
|
|
|
|
tap.test('should filter tags with minimatch pattern', async () => {
|
|
const allTags = await testGhostInstance.getTags();
|
|
|
|
if (allTags.length > 0) {
|
|
const firstTagSlug = allTags[0].slug;
|
|
const pattern = `${firstTagSlug.charAt(0)}*`;
|
|
|
|
const filteredTags = await testGhostInstance.getTags({ filter: pattern });
|
|
expect(filteredTags).toBeArray();
|
|
console.log(`Filtered tags with pattern '${pattern}':`);
|
|
filteredTags.forEach((tag) => {
|
|
console.log(`-> ${tag.name} (${tag.slug})`);
|
|
expect(tag.slug).toMatch(new RegExp(`^${firstTagSlug.charAt(0)}`));
|
|
});
|
|
} else {
|
|
console.log('No tags available to test filtering');
|
|
}
|
|
});
|
|
|
|
tap.test('should get tag by slug', async () => {
|
|
const tags = await testGhostInstance.getTags({ limit: 1 });
|
|
if (tags.length > 0) {
|
|
const tag = await testGhostInstance.getTagBySlug(tags[0].slug);
|
|
expect(tag).toBeInstanceOf(ghost.Tag);
|
|
console.log(`Got tag: ${tag.getName()} (${tag.getSlug()})`);
|
|
}
|
|
});
|
|
|
|
tap.test('should get all authors', async () => {
|
|
const authors = await testGhostInstance.getAuthors();
|
|
expect(authors).toBeArray();
|
|
console.log(`Found ${authors.length} authors:`);
|
|
authors.forEach((author) => {
|
|
console.log(`-> ${author.getName()} (${author.getSlug()})`);
|
|
});
|
|
});
|
|
|
|
tap.test('should filter authors with minimatch pattern', async () => {
|
|
const authors = await testGhostInstance.getAuthors();
|
|
if (authors.length > 0) {
|
|
const firstAuthorSlug = authors[0].getSlug();
|
|
const pattern = `${firstAuthorSlug.charAt(0)}*`;
|
|
const filteredAuthors = await testGhostInstance.getAuthors({ filter: pattern });
|
|
expect(filteredAuthors).toBeArray();
|
|
console.log(`Filtered authors with pattern '${pattern}':`);
|
|
filteredAuthors.forEach((author) => {
|
|
console.log(`-> ${author.getName()} (${author.getSlug()})`);
|
|
});
|
|
}
|
|
});
|
|
|
|
tap.test('should get all pages', async () => {
|
|
const pages = await testGhostInstance.getPages();
|
|
expect(pages).toBeArray();
|
|
console.log(`Found ${pages.length} pages:`);
|
|
pages.forEach((page) => {
|
|
console.log(`-> ${page.getTitle()} (${page.getSlug()})`);
|
|
});
|
|
});
|
|
|
|
tap.test('should filter posts by tag', async () => {
|
|
const tags = await testGhostInstance.getTags({ limit: 1 });
|
|
if (tags.length > 0) {
|
|
const posts = await testGhostInstance.getPosts({ tag: tags[0].slug, limit: 5 });
|
|
expect(posts).toBeArray();
|
|
console.log(`Found ${posts.length} posts with tag '${tags[0].name}'`);
|
|
}
|
|
});
|
|
|
|
tap.test('should filter posts by featured status', async () => {
|
|
const featuredPosts = await testGhostInstance.getPosts({ featured: true, limit: 5 });
|
|
expect(featuredPosts).toBeArray();
|
|
console.log(`Found ${featuredPosts.length} featured posts`);
|
|
});
|
|
|
|
tap.test('should search posts', async () => {
|
|
const searchResults = await testGhostInstance.searchPosts('the', { limit: 5 });
|
|
expect(searchResults).toBeArray();
|
|
console.log(`Found ${searchResults.length} posts matching 'the':`);
|
|
searchResults.forEach((post) => {
|
|
console.log(`-> ${post.getTitle()}`);
|
|
});
|
|
});
|
|
|
|
tap.test('should get related posts', async () => {
|
|
const posts = await testGhostInstance.getPosts({ limit: 1 });
|
|
if (posts.length > 0) {
|
|
const relatedPosts = await testGhostInstance.getRelatedPosts(posts[0].getId(), 3);
|
|
expect(relatedPosts).toBeArray();
|
|
console.log(`Found ${relatedPosts.length} related posts for '${posts[0].getTitle()}'`);
|
|
relatedPosts.forEach((post) => {
|
|
console.log(`-> ${post.getTitle()}`);
|
|
});
|
|
}
|
|
});
|
|
|
|
tap.test('should get members', async () => {
|
|
try {
|
|
const members = await testGhostInstance.getMembers({ limit: 10 });
|
|
expect(members).toBeArray();
|
|
console.log(`Found ${members.length} members`);
|
|
if (members.length > 0) {
|
|
console.log(`First member: ${members[0].getEmail()}`);
|
|
}
|
|
} catch (error: any) {
|
|
if (error.message?.includes('members') || error.statusCode === 403) {
|
|
console.log('Members feature not available or requires permissions');
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
});
|
|
|
|
tap.test('should get settings', async () => {
|
|
try {
|
|
const settings = await testGhostInstance.getSettings();
|
|
expect(settings).toBeTruthy();
|
|
console.log(`Retrieved ${settings.settings?.length || 0} settings`);
|
|
} catch (error: any) {
|
|
if (error.message?.includes('undefined') || error.statusCode === 403) {
|
|
console.log('Settings API not available or requires different permissions');
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
});
|
|
|
|
tap.test('should get webhooks', async () => {
|
|
try {
|
|
const webhooks = await testGhostInstance.getWebhooks();
|
|
expect(webhooks).toBeArray();
|
|
console.log(`Found ${webhooks.length} webhooks`);
|
|
} catch (error: any) {
|
|
if (error.message?.includes('not a function') || error.statusCode === 403) {
|
|
console.log('Webhooks API not available in this Ghost version');
|
|
} else {
|
|
throw error;
|
|
}
|
|
}
|
|
});
|
|
|
|
tap.start()
|