UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

112 lines 10.2 kB
/** * Test Environment Configuration * * This module provides test-specific environment variable access. * Test code should ONLY use these functions to access GitHub credentials, * NEVER the production credentials from env.ts * * Safety Rules: * - Tests ONLY use GITHUB_TEST_* variables * - Tests NEVER fall back to production GITHUB_* variables * - Tests skip gracefully if test credentials are not configured * * Usage: * ```typescript * import { getTestGitHubToken, hasTestCredentials } from './config/test-env'; * * if (!hasTestCredentials()) { * console.log('⏭️ Skipping test - GITHUB_TEST_TOKEN not set'); * return; * } * * const token = getTestGitHubToken(); * ``` */ import { env } from './env.js'; /** * Get GitHub token for tests * * IMPORTANT: This function ONLY returns GITHUB_TEST_TOKEN and NEVER falls * back to the production GITHUB_TOKEN. This prevents tests from accidentally * using production credentials. * * @returns {string} Test GitHub token * @throws {Error} If GITHUB_TEST_TOKEN is not set */ export function getTestGitHubToken() { const token = env.GITHUB_TEST_TOKEN; if (!token) { throw new Error('❌ GITHUB_TEST_TOKEN not set. Tests require dedicated test credentials.\n\n' + 'To enable GitHub integration tests:\n' + '1. Create a SEPARATE GitHub account for testing (NOT your production account!)\n' + '2. Generate a token at: https://github.com/settings/tokens\n' + '3. Add to .env.local:\n' + ' GITHUB_TEST_TOKEN=ghp_your_test_token_here\n' + ' GITHUB_TEST_USERNAME=test-username\n' + ' GITHUB_TEST_REPOSITORY=test-username/dollhouse-test-sandbox\n\n' + '⚠️ NEVER use your production GITHUB_TOKEN for tests!'); } return token; } /** * Get GitHub username for tests * * @returns {string | undefined} Test GitHub username */ export function getTestGitHubUsername() { return env.GITHUB_TEST_USERNAME; } /** * Get GitHub repository for tests * * @returns {string | undefined} Test GitHub repository (format: username/repo) */ export function getTestGitHubRepository() { return env.GITHUB_TEST_REPOSITORY; } /** * Check if test credentials are configured * * Use this to conditionally run tests that require GitHub access: * * ```typescript * if (!hasTestCredentials()) { * console.log('⏭️ Skipping GitHub test - credentials not configured'); * return; * } * ``` * * @returns {boolean} True if GITHUB_TEST_TOKEN is set */ export function hasTestCredentials() { return !!env.GITHUB_TEST_TOKEN; } /** * Get skip message for tests * * Returns a consistent message for tests that are skipped due to missing credentials. * * @returns {string} Skip message with setup instructions */ export function getTestSkipMessage() { return ('⏭️ Skipping E2E tests - GITHUB_TEST_TOKEN not available\n\n' + 'To run these tests:\n' + '1. Copy .env.example to .env.local\n' + '2. Set GITHUB_TEST_TOKEN with a token from a SEPARATE test GitHub account\n' + '3. Run tests again: npm run test:e2e\n\n' + 'See docs/guides/environment-variables.md for detailed setup instructions.'); } /** * Assert test credentials are configured (for use in test setup) * * Call this in beforeAll() to ensure tests have required credentials. * Tests will fail with clear error message if credentials are missing. * * @throws {Error} If test credentials are not configured */ export function assertTestCredentials() { if (!hasTestCredentials()) { throw new Error(getTestSkipMessage()); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1lbnYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uZmlnL3Rlc3QtZW52LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUVILE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0I7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsaUJBQWlCLENBQUM7SUFFcEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RUFBNEU7WUFDNUUsdUNBQXVDO1lBQ3ZDLGtGQUFrRjtZQUNsRiw4REFBOEQ7WUFDOUQseUJBQXlCO1lBQ3pCLGlEQUFpRDtZQUNqRCx5Q0FBeUM7WUFDekMsb0VBQW9FO1lBQ3BFLHVEQUF1RCxDQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLE9BQU8sR0FBRyxDQUFDLG9CQUFvQixDQUFDO0FBQ2xDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QjtJQUNyQyxPQUFPLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCO0lBQ2hDLE9BQU8sQ0FDTCw4REFBOEQ7UUFDOUQsdUJBQXVCO1FBQ3ZCLHNDQUFzQztRQUN0Qyw2RUFBNkU7UUFDN0UsMENBQTBDO1FBQzFDLDJFQUEyRSxDQUM1RSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCO0lBQ25DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDeEMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRlc3QgRW52aXJvbm1lbnQgQ29uZmlndXJhdGlvblxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRlc3Qtc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGUgYWNjZXNzLlxuICogVGVzdCBjb2RlIHNob3VsZCBPTkxZIHVzZSB0aGVzZSBmdW5jdGlvbnMgdG8gYWNjZXNzIEdpdEh1YiBjcmVkZW50aWFscyxcbiAqIE5FVkVSIHRoZSBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzIGZyb20gZW52LnRzXG4gKlxuICogU2FmZXR5IFJ1bGVzOlxuICogLSBUZXN0cyBPTkxZIHVzZSBHSVRIVUJfVEVTVF8qIHZhcmlhYmxlc1xuICogLSBUZXN0cyBORVZFUiBmYWxsIGJhY2sgdG8gcHJvZHVjdGlvbiBHSVRIVUJfKiB2YXJpYWJsZXNcbiAqIC0gVGVzdHMgc2tpcCBncmFjZWZ1bGx5IGlmIHRlc3QgY3JlZGVudGlhbHMgYXJlIG5vdCBjb25maWd1cmVkXG4gKlxuICogVXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBnZXRUZXN0R2l0SHViVG9rZW4sIGhhc1Rlc3RDcmVkZW50aWFscyB9IGZyb20gJy4vY29uZmlnL3Rlc3QtZW52JztcbiAqXG4gKiBpZiAoIWhhc1Rlc3RDcmVkZW50aWFscygpKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfij63vuI8gU2tpcHBpbmcgdGVzdCAtIEdJVEhVQl9URVNUX1RPS0VOIG5vdCBzZXQnKTtcbiAqICAgcmV0dXJuO1xuICogfVxuICpcbiAqIGNvbnN0IHRva2VuID0gZ2V0VGVzdEdpdEh1YlRva2VuKCk7XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBlbnYgfSBmcm9tICcuL2Vudi5qcyc7XG5cbi8qKlxuICogR2V0IEdpdEh1YiB0b2tlbiBmb3IgdGVzdHNcbiAqXG4gKiBJTVBPUlRBTlQ6IFRoaXMgZnVuY3Rpb24gT05MWSByZXR1cm5zIEdJVEhVQl9URVNUX1RPS0VOIGFuZCBORVZFUiBmYWxsc1xuICogYmFjayB0byB0aGUgcHJvZHVjdGlvbiBHSVRIVUJfVE9LRU4uIFRoaXMgcHJldmVudHMgdGVzdHMgZnJvbSBhY2NpZGVudGFsbHlcbiAqIHVzaW5nIHByb2R1Y3Rpb24gY3JlZGVudGlhbHMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGVzdCBHaXRIdWIgdG9rZW5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBHSVRIVUJfVEVTVF9UT0tFTiBpcyBub3Qgc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0R2l0SHViVG9rZW4oKTogc3RyaW5nIHtcbiAgY29uc3QgdG9rZW4gPSBlbnYuR0lUSFVCX1RFU1RfVE9LRU47XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICfinYwgR0lUSFVCX1RFU1RfVE9LRU4gbm90IHNldC4gVGVzdHMgcmVxdWlyZSBkZWRpY2F0ZWQgdGVzdCBjcmVkZW50aWFscy5cXG5cXG4nICtcbiAgICAgICdUbyBlbmFibGUgR2l0SHViIGludGVncmF0aW9uIHRlc3RzOlxcbicgK1xuICAgICAgJzEuIENyZWF0ZSBhIFNFUEFSQVRFIEdpdEh1YiBhY2NvdW50IGZvciB0ZXN0aW5nIChOT1QgeW91ciBwcm9kdWN0aW9uIGFjY291bnQhKVxcbicgK1xuICAgICAgJzIuIEdlbmVyYXRlIGEgdG9rZW4gYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9zZXR0aW5ncy90b2tlbnNcXG4nICtcbiAgICAgICczLiBBZGQgdG8gLmVudi5sb2NhbDpcXG4nICtcbiAgICAgICcgICBHSVRIVUJfVEVTVF9UT0tFTj1naHBfeW91cl90ZXN0X3Rva2VuX2hlcmVcXG4nICtcbiAgICAgICcgICBHSVRIVUJfVEVTVF9VU0VSTkFNRT10ZXN0LXVzZXJuYW1lXFxuJyArXG4gICAgICAnICAgR0lUSFVCX1RFU1RfUkVQT1NJVE9SWT10ZXN0LXVzZXJuYW1lL2RvbGxob3VzZS10ZXN0LXNhbmRib3hcXG5cXG4nICtcbiAgICAgICfimqDvuI8gIE5FVkVSIHVzZSB5b3VyIHByb2R1Y3Rpb24gR0lUSFVCX1RPS0VOIGZvciB0ZXN0cyEnXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB0b2tlbjtcbn1cblxuLyoqXG4gKiBHZXQgR2l0SHViIHVzZXJuYW1lIGZvciB0ZXN0c1xuICpcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRlc3QgR2l0SHViIHVzZXJuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXN0R2l0SHViVXNlcm5hbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVudi5HSVRIVUJfVEVTVF9VU0VSTkFNRTtcbn1cblxuLyoqXG4gKiBHZXQgR2l0SHViIHJlcG9zaXRvcnkgZm9yIHRlc3RzXG4gKlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGVzdCBHaXRIdWIgcmVwb3NpdG9yeSAoZm9ybWF0OiB1c2VybmFtZS9yZXBvKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVzdEdpdEh1YlJlcG9zaXRvcnkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGVudi5HSVRIVUJfVEVTVF9SRVBPU0lUT1JZO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRlc3QgY3JlZGVudGlhbHMgYXJlIGNvbmZpZ3VyZWRcbiAqXG4gKiBVc2UgdGhpcyB0byBjb25kaXRpb25hbGx5IHJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgR2l0SHViIGFjY2VzczpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpZiAoIWhhc1Rlc3RDcmVkZW50aWFscygpKSB7XG4gKiAgIGNvbnNvbGUubG9nKCfij63vuI8gU2tpcHBpbmcgR2l0SHViIHRlc3QgLSBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICogICByZXR1cm47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBHSVRIVUJfVEVTVF9UT0tFTiBpcyBzZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Rlc3RDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhZW52LkdJVEhVQl9URVNUX1RPS0VOO1xufVxuXG4vKipcbiAqIEdldCBza2lwIG1lc3NhZ2UgZm9yIHRlc3RzXG4gKlxuICogUmV0dXJucyBhIGNvbnNpc3RlbnQgbWVzc2FnZSBmb3IgdGVzdHMgdGhhdCBhcmUgc2tpcHBlZCBkdWUgdG8gbWlzc2luZyBjcmVkZW50aWFscy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTa2lwIG1lc3NhZ2Ugd2l0aCBzZXR1cCBpbnN0cnVjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlc3RTa2lwTWVzc2FnZSgpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgICfij63vuI8gIFNraXBwaW5nIEUyRSB0ZXN0cyAtIEdJVEhVQl9URVNUX1RPS0VOIG5vdCBhdmFpbGFibGVcXG5cXG4nICtcbiAgICAnVG8gcnVuIHRoZXNlIHRlc3RzOlxcbicgK1xuICAgICcxLiBDb3B5IC5lbnYuZXhhbXBsZSB0byAuZW52LmxvY2FsXFxuJyArXG4gICAgJzIuIFNldCBHSVRIVUJfVEVTVF9UT0tFTiB3aXRoIGEgdG9rZW4gZnJvbSBhIFNFUEFSQVRFIHRlc3QgR2l0SHViIGFjY291bnRcXG4nICtcbiAgICAnMy4gUnVuIHRlc3RzIGFnYWluOiBucG0gcnVuIHRlc3Q6ZTJlXFxuXFxuJyArXG4gICAgJ1NlZSBkb2NzL2d1aWRlcy9lbnZpcm9ubWVudC12YXJpYWJsZXMubWQgZm9yIGRldGFpbGVkIHNldHVwIGluc3RydWN0aW9ucy4nXG4gICk7XG59XG5cbi8qKlxuICogQXNzZXJ0IHRlc3QgY3JlZGVudGlhbHMgYXJlIGNvbmZpZ3VyZWQgKGZvciB1c2UgaW4gdGVzdCBzZXR1cClcbiAqXG4gKiBDYWxsIHRoaXMgaW4gYmVmb3JlQWxsKCkgdG8gZW5zdXJlIHRlc3RzIGhhdmUgcmVxdWlyZWQgY3JlZGVudGlhbHMuXG4gKiBUZXN0cyB3aWxsIGZhaWwgd2l0aCBjbGVhciBlcnJvciBtZXNzYWdlIGlmIGNyZWRlbnRpYWxzIGFyZSBtaXNzaW5nLlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0ZXN0IGNyZWRlbnRpYWxzIGFyZSBub3QgY29uZmlndXJlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0VGVzdENyZWRlbnRpYWxzKCk6IHZvaWQge1xuICBpZiAoIWhhc1Rlc3RDcmVkZW50aWFscygpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGdldFRlc3RTa2lwTWVzc2FnZSgpKTtcbiAgfVxufVxuIl19