Map Traveler MCP
by mfukushim
- map-traveler-mcp
- test
import {beforeAll, describe, expect, it} from "@effect/vitest"
import {Effect, Logger, LogLevel} from "effect";
import {ImageService, ImageServiceLive} from "../src/ImageService.js";
import {runPromise} from "effect/Effect";
import {FetchHttpClient} from "@effect/platform";
import * as fs from "node:fs";
import {DbService, DbServiceLive} from "../src/DbService.js";
import {NodeFileSystem} from "@effect/platform-node"
// import {transparentBackground} from "transparent-background";
import {McpLogService, McpLogServiceLive} from "../src/McpLogService.js";
const inGitHubAction = process.env.GITHUB_ACTIONS === 'true';
describe("Image", () => {
beforeAll(async () => {
return await DbService.initSystemMode().pipe(
Effect.provide([DbServiceLive, McpLogServiceLive]),
Effect.runPromise
)
});
it("makeHotelPictPixAi", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.makeHotelPict("pixAi", 12) //
}).pipe(
Effect.provide([DbServiceLive,ImageService.Default, FetchHttpClient.layer, McpLogServiceLive, NodeFileSystem.layer]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => McpLogService.logError(e.toString()).pipe(Effect.provide(McpLogServiceLive))),
Effect.tap(a => McpLogService.log(a.length).pipe(Effect.provide(McpLogServiceLive))),
runPromise
)
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeHotelPictPixAi.jpg", res);
}
expect(res).toBeInstanceOf(Buffer)
})
it("makeHotelPictSd", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.makeHotelPict("sd", 12) //
}).pipe(
Effect.provide([DbServiceLive, ImageService.Default, FetchHttpClient.layer, McpLogServiceLive, NodeFileSystem.layer]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => McpLogService.logError(e.toString()).pipe(Effect.provide(McpLogServiceLive))),
Effect.tap(a => McpLogService.log(a.length).pipe(Effect.provide(McpLogServiceLive))),
runPromise
)
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeHotelPictSd.jpg", res);
}
expect(res).toBeInstanceOf(Buffer)
})
it("makeHotelPictComfy", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.makeHotelPict("comfyUi", 12) //
}).pipe(
Effect.provide([DbServiceLive,ImageService.Default, FetchHttpClient.layer, McpLogServiceLive, NodeFileSystem.layer]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => McpLogService.logError(e.toString()).pipe(Effect.provide(McpLogServiceLive))),
Effect.tap(a => McpLogService.log(a.length).pipe(Effect.provide(McpLogServiceLive))),
runPromise
)
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeHotelComfyUi.jpg", res);
}
expect(res).toBeInstanceOf(Buffer)
})
it("pixAiMakeT2I", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.selectImageGenerator("pixAi","depth of field, cinematic composition, masterpiece, best quality,looking at viewer,anime,(solo:1.1),(1 girl:1.1),loli,school uniform,blue skirt,long socks,black pixie cut") //
}).pipe(
Effect.provide([ImageService.Default, FetchHttpClient.layer, McpLogServiceLive]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.andThen(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/pixAiMakeImage.jpg", a);
}
return "succeed";
}),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.catchIf(a => a instanceof Error && a.message === 'no key', e => Effect.succeed("noKey")),
runPromise
)
expect(typeof res).toBe('string')
})
it("pixAiMakeI2I", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
// 実行エラーが取れると実行できたりする。。 intellijの問題だが、どういう種類の問題なんだろう。。。仕方ないからしばらくはコマンドライン併用、、
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.selectImageGenerator("pixAi","depth of field, cinematic composition, masterpiece, best quality,looking at viewer,anime,(solo:1.1),(1 girl:1.1),loli,school uniform,blue skirt,long socks,black pixie cut", buffer) //
}).pipe(
Effect.provide([ImageService.Default, FetchHttpClient.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.andThen(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/pixAiMakeI2I.jpg", a)
}
return "succeed";
}),
Effect.tapError(e => McpLogService.logError(e.toString()).pipe(Effect.provide(McpLogServiceLive))),
Effect.catchIf(a => a instanceof Error && a.message === 'no key', e => Effect.succeed("noKey")),
runPromise
)
expect(typeof res).toBe('string')
})
it("sdMakeT2I", async () => {
// vitest --run --testNamePattern=calcDomesticTravelRoute MapService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.selectImageGenerator("sd","depth of field, cinematic composition, masterpiece, best quality,looking at viewer,anime,(solo:1.1),(1 girl:1.1),loli,school uniform,blue skirt,long socks,black pixie cut") //
}).pipe(
Effect.provide([ImageService.Default, FetchHttpClient.layer, McpLogServiceLive]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.andThen(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/sdMakeImage.jpg", a);
}
return "succeed";
}),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.catchIf(a => a instanceof Error && a.message === 'no key', e => Effect.succeed("noKey")),
runPromise
)
expect(typeof res).toBe('string')
})
it("sdMakeI2I", async () => {
// vitest --run --testNamePattern=sdMakeI2I ImageService.test.ts
// 実行エラーが取れると実行できたりする。。 intellijの問題だが、どういう種類の問題なんだろう。。。仕方ないからしばらくはコマンドライン併用、、
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.selectImageGenerator("sd","depth of field, cinematic composition, masterpiece, best quality,looking at viewer,anime,(solo:1.1),(1 girl:1.1),loli,school uniform,blue skirt,long socks,black pixie cut", buffer) //
}).pipe(
Effect.provide([ImageService.Default, FetchHttpClient.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.andThen(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/sdMakeI2I.jpg", a)
}
return "succeed";
}),
Effect.tapError(e => McpLogService.logError(e.toString()).pipe(Effect.provide(McpLogServiceLive))),
Effect.catchIf(a => a instanceof Error && a.message === 'no key', e => Effect.succeed("noKey")),
runPromise
)
expect(typeof res).toBe('string')
})
it("makeRunnerImageV3_i2iPixAI", async () => {
// vitest --run --testNamePattern=makeRunnerImageV3_i2i ImageService.test.ts
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.makeRunnerImageV3(buffer, 'pixAi',false, {bodyWindowRatioW:0.7,bodyWindowRatioH:0.7,bodyAreaRatio:0.001,bodyHWRatio:0.3}, true) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]),
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeRunnerImageV3PixAI.png", a.buf);
}
}),
Effect.catchIf(a => a.toString() === 'Error: no key', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
})
it("makeRunnerImageV3_i2iSd", async () => {
// vitest --run --testNamePattern=makeRunnerImageV3_i2i ImageService.test.ts
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.makeRunnerImageV3(buffer, 'sd', false,{}, true) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeRunnerImageV3Sd.png", a.buf);
}
}),
Effect.catchIf(a => a.toString() === 'Error: no key', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
})
it("makeRunnerImageV3_i2iComfy", async () => {
// vitest --run --testNamePattern=makeRunnerImageV3_i2i ImageService.test.ts
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.makeRunnerImageV3(buffer, 'comfyUi', false,{}, true) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/makeRunnerImageV3_i2iComfy.png", a.buf);
}
}),
Effect.catchIf(a => a.toString() === 'Error: no key', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
},10*60*1000)
it("comfyApiMakeImage_t2i", async () => {
// vitest --run --testNamePattern=comfyApiMakeImage_t2i ImageService.test.ts
const res = await Effect.gen(function* () {
return yield* ImageService.comfyApiMakeImage('1girl',undefined,{ckpt_name:"animagineXL40_v40.safetensors"}) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/comfyApiMakeImage_t2i.png",Buffer.from(a));
}
}),
Effect.catchIf(a => a.toString() === 'Error: no comfy_url', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
})
it("comfyApiMakeImage_i2i", async () => {
// vitest --run --testNamePattern=comfyApiMakeImage ImageService.test.ts
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/test.jpg');
return yield* ImageService.comfyApiMakeImage('1girl',buffer,{ckpt_name:"animagineXL40_v40.safetensors"}) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/comfyApiMakeImage_i2i.png",Buffer.from(a));
}
}),
Effect.catchIf(a => a.toString() === 'Error: no comfy_url', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
})
it("rembgService", async () => {
// vitest --run --testNamePattern=comfyApiMakeImage ImageService.test.ts
const res = await Effect.gen(function* () {
const buffer = fs.readFileSync('tools/testRembg.png');
return yield* ImageService.rembgService(buffer) //
}).pipe(
Effect.provide([ImageServiceLive, FetchHttpClient.layer, DbServiceLive, NodeFileSystem.layer, McpLogServiceLive]), // layer
Logger.withMinimumLogLevel(LogLevel.Trace),
Effect.tapError(e => Effect.logError(e.toString())),
Effect.tap(a => {
if (!inGitHubAction) {
fs.writeFileSync("tools/test/rembgOut.png",Buffer.from(a));
}
}),
Effect.catchIf(a => a.toString() === 'Error: no rembg url', e => Effect.succeed({})),
// Effect.tap(a => Effect.log(a)),
runPromise
)
expect(typeof res).toBe('object')
})
})