google-images.recorded.test.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { describe, expect } from "bun:test"
  2. import { Effect } from "effect"
  3. import { Image, ImageInput } from "../../src/index.js"
  4. import { Google } from "../../src/providers.js"
  5. import { dimensions } from "../lib/image.js"
  6. import { recordedTests } from "../recorded-test.js"
  7. const model = Google.configure({
  8. apiKey: process.env.GOOGLE_GENERATIVE_AI_API_KEY ?? "fixture",
  9. }).image("gemini-3.1-flash-image")
  10. const recorded = recordedTests({
  11. prefix: "google-images",
  12. provider: "google",
  13. protocol: "google-images",
  14. requires: ["GOOGLE_GENERATIVE_AI_API_KEY"],
  15. })
  16. describe("Google Images recorded", () => {
  17. recorded.effect("generates an image", () =>
  18. Effect.gen(function* () {
  19. const response = yield* Image.generate({
  20. model,
  21. prompt: "A simple flat blue circle centered on a plain white background.",
  22. options: { aspectRatio: "1:1" },
  23. })
  24. expect(response.images).toHaveLength(1)
  25. expect(response.image?.mediaType).toMatch(/^image\//)
  26. expect(response.image?.data).toBeInstanceOf(Uint8Array)
  27. expect(response.image?.data.length).toBeGreaterThan(0)
  28. }),
  29. )
  30. recorded.effect("edits an image", () =>
  31. Effect.gen(function* () {
  32. const response = yield* Image.generate({
  33. model,
  34. prompt:
  35. "Transform this minimal source into a bright orange sun icon with eight rounded rays on a pale blue background.",
  36. images: [
  37. ImageInput.bytes(
  38. yield* Effect.promise(() => Bun.file("test/fixtures/images/edit-source.jpg").bytes()),
  39. "image/jpeg",
  40. ),
  41. ],
  42. options: { aspectRatio: "1:1" },
  43. })
  44. expect(response.image?.mediaType).toBe("image/jpeg")
  45. expect(response.image?.data).toBeInstanceOf(Uint8Array)
  46. if (!(response.image?.data instanceof Uint8Array)) throw new Error("Expected owned Google image bytes")
  47. expect(dimensions(response.image.data)).toEqual({ width: 1024, height: 1024 })
  48. }),
  49. )
  50. })