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'; let testGhostInstance: ghost.Ghost; let createdMember: ghost.Member; tap.test('initialize Ghost instance', 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 all members', async () => { try { const members = await testGhostInstance.getMembers({ limit: 10 }); expect(members).toBeArray(); console.log(`Found ${members.length} members`); if (members.length > 0) { expect(members[0]).toBeInstanceOf(ghost.Member); 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 - skipping test'); } else { throw error; } } }); tap.test('should get members with limit', async () => { try { const members = await testGhostInstance.getMembers({ limit: 2 }); expect(members).toBeArray(); expect(members.length).toBeLessThanOrEqual(2); } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403) { console.log('Members feature not available - skipping test'); } else { throw error; } } }); tap.test('should filter members with minimatch pattern', async () => { try { const members = await testGhostInstance.getMembers({ filter: '*@gmail.com' }); expect(members).toBeArray(); console.log(`Found ${members.length} Gmail members`); if (members.length > 0) { members.forEach((member) => { expect(member.getEmail()).toContain('@gmail.com'); }); } } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403) { console.log('Members feature not available - skipping test'); } else { throw error; } } }); tap.test('should create member', async () => { try { const timestamp = Date.now(); createdMember = await testGhostInstance.createMember({ email: `test${timestamp}@example.com`, name: `Test Member ${timestamp}` }); expect(createdMember).toBeInstanceOf(ghost.Member); expect(createdMember.getEmail()).toEqual(`test${timestamp}@example.com`); console.log(`Created member: ${createdMember.getId()}`); } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403) { console.log('Members feature not available - skipping test'); } else { throw error; } } }); tap.test('should access member methods', async () => { if (createdMember) { expect(createdMember.getId()).toBeTruthy(); expect(createdMember.getEmail()).toBeTruthy(); expect(createdMember.getName()).toBeTruthy(); const json = createdMember.toJson(); expect(json).toBeTruthy(); expect(json.id).toEqual(createdMember.getId()); } }); tap.test('should get member by email', async () => { if (createdMember) { try { const member = await testGhostInstance.getMemberByEmail(createdMember.getEmail()); expect(member).toBeInstanceOf(ghost.Member); expect(member.getEmail()).toEqual(createdMember.getEmail()); } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403 || error.type === 'RequestNotAcceptableError') { console.log('Member by email not supported in this Ghost version - using ID instead'); const member = await testGhostInstance.getMemberById(createdMember.getId()); expect(member).toBeInstanceOf(ghost.Member); } else { throw error; } } } }); tap.test('should update member', async () => { if (createdMember) { try { const updatedMember = await createdMember.update({ note: 'Updated by automated tests' }); expect(updatedMember).toBeInstanceOf(ghost.Member); console.log(`Updated member: ${updatedMember.getId()}`); } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403) { console.log('Members feature not available - skipping test'); } else { throw error; } } } }); tap.test('should delete member', async () => { if (createdMember) { try { await createdMember.delete(); console.log(`Deleted member: ${createdMember.getId()}`); } catch (error: any) { if (error.message?.includes('members') || error.statusCode === 403) { console.log('Members feature not available - skipping test'); } else { throw error; } } } }); export default tap.start();