Google

@crvouga/mockingbird-service-google

Stateful Google public vendor API emulator with native namespaces, checkpoints and test controls.

Parity: Vendor API workflows compared with the pinned Emulate package oracleProductivity62 of 62 operationsIn-process fetchNode servermockingbird-google
$
npm install -D @crvouga/mockingbird-service-google

Playground

Requests go to the real emulator running in this tab. State persists across requests, and the journal shows what it received. A green dot marks operations whose sample succeeds as-is; others need ids from earlier responses.

Loads the real @crvouga/mockingbird-service-google into this tab on first send
https://www.googleapis.com

Send a request to see the emulator's response.

Operations

62 of 62 operations in the vendored contract are emulated.

MethodPathOperationStatus
DELETE/calendar/v3/calendars/{calendarId}/events/{eventId}DELETE /calendar/v3/calendars/:calendarId/events/:eventIdDELETE /calendar/v3/calendars/:calendarId/events/:eventId
GET/gmail/v1/users/{userId}/drafts/{id}GET /gmail/v1/users/:userId/drafts/:idGET /gmail/v1/users/:userId/drafts/:id
PUT/gmail/v1/users/{userId}/drafts/{id}PUT /gmail/v1/users/:userId/drafts/:idPUT /gmail/v1/users/:userId/drafts/:id
DELETE/gmail/v1/users/{userId}/drafts/{id}DELETE /gmail/v1/users/:userId/drafts/:idDELETE /gmail/v1/users/:userId/drafts/:id
GET/gmail/v1/users/{userId}/labels/{id}GET /gmail/v1/users/:userId/labels/:idGET /gmail/v1/users/:userId/labels/:id
PUT/gmail/v1/users/{userId}/labels/{id}PUT /gmail/v1/users/:userId/labels/:idPUT /gmail/v1/users/:userId/labels/:id
PATCH/gmail/v1/users/{userId}/labels/{id}PATCH /gmail/v1/users/:userId/labels/:idPATCH /gmail/v1/users/:userId/labels/:id
DELETE/gmail/v1/users/{userId}/labels/{id}DELETE /gmail/v1/users/:userId/labels/:idDELETE /gmail/v1/users/:userId/labels/:id
GET/gmail/v1/users/{userId}/messages/{id}GET /gmail/v1/users/:userId/messages/:idGET /gmail/v1/users/:userId/messages/:id
DELETE/gmail/v1/users/{userId}/messages/{id}DELETE /gmail/v1/users/:userId/messages/:idDELETE /gmail/v1/users/:userId/messages/:id
DELETE/gmail/v1/users/{userId}/settings/filters/{id}DELETE /gmail/v1/users/:userId/settings/filters/:idDELETE /gmail/v1/users/:userId/settings/filters/:id
GET/gmail/v1/users/{userId}/threads/{id}GET /gmail/v1/users/:userId/threads/:idGET /gmail/v1/users/:userId/threads/:id
DELETE/gmail/v1/users/{userId}/threads/{id}DELETE /gmail/v1/users/:userId/threads/:idDELETE /gmail/v1/users/:userId/threads/:id
GET/.well-known/openid-configurationGET /.well-known/openid-configurationGET /.well-known/openid-configuration
GET/calendar/v3/calendars/{calendarId}/eventsGET /calendar/v3/calendars/:calendarId/eventsGET /calendar/v3/calendars/:calendarId/events
POST/calendar/v3/calendars/{calendarId}/eventsPOST /calendar/v3/calendars/:calendarId/eventsPOST /calendar/v3/calendars/:calendarId/events
GET/calendar/v3/users/{userId}/calendarListGET /calendar/v3/users/:userId/calendarListGET /calendar/v3/users/:userId/calendarList
GET/discovery/v1/apis/calendar/v3/restGET /discovery/v1/apis/calendar/v3/restGET /discovery/v1/apis/calendar/v3/rest
GET/drive/v3/filesGET /drive/v3/filesGET /drive/v3/files
POST/drive/v3/filesPOST /drive/v3/filesPOST /drive/v3/files
GET/drive/v3/files/{fileId}GET /drive/v3/files/:fileIdGET /drive/v3/files/:fileId
PUT/drive/v3/files/{fileId}PUT /drive/v3/files/:fileIdPUT /drive/v3/files/:fileId
PATCH/drive/v3/files/{fileId}PATCH /drive/v3/files/:fileIdPATCH /drive/v3/files/:fileId
GET/gmail/v1/users/{userId}/draftsGET /gmail/v1/users/:userId/draftsGET /gmail/v1/users/:userId/drafts
POST/gmail/v1/users/{userId}/draftsPOST /gmail/v1/users/:userId/draftsPOST /gmail/v1/users/:userId/drafts
GET/gmail/v1/users/{userId}/historyGET /gmail/v1/users/:userId/historyGET /gmail/v1/users/:userId/history
GET/gmail/v1/users/{userId}/labelsGET /gmail/v1/users/:userId/labelsGET /gmail/v1/users/:userId/labels
POST/gmail/v1/users/{userId}/labelsPOST /gmail/v1/users/:userId/labelsPOST /gmail/v1/users/:userId/labels
GET/gmail/v1/users/{userId}/messagesGET /gmail/v1/users/:userId/messagesGET /gmail/v1/users/:userId/messages
POST/gmail/v1/users/{userId}/messagesPOST /gmail/v1/users/:userId/messagesPOST /gmail/v1/users/:userId/messages
GET/gmail/v1/users/{userId}/messages/{messageId}/attachments/{id}GET /gmail/v1/users/:userId/messages/:messageId/attachments/:idGET /gmail/v1/users/:userId/messages/:messageId/attachments/:id
GET/gmail/v1/users/{userId}/settings/filtersGET /gmail/v1/users/:userId/settings/filtersGET /gmail/v1/users/:userId/settings/filters
POST/gmail/v1/users/{userId}/settings/filtersPOST /gmail/v1/users/:userId/settings/filtersPOST /gmail/v1/users/:userId/settings/filters
GET/gmail/v1/users/{userId}/settings/forwardingAddressesGET /gmail/v1/users/:userId/settings/forwardingAddressesGET /gmail/v1/users/:userId/settings/forwardingAddresses
GET/gmail/v1/users/{userId}/settings/sendAsGET /gmail/v1/users/:userId/settings/sendAsGET /gmail/v1/users/:userId/settings/sendAs
GET/gmail/v1/users/{userId}/threadsGET /gmail/v1/users/:userId/threadsGET /gmail/v1/users/:userId/threads
GET/o/oauth2/v2/authGET /o/oauth2/v2/authGET /o/oauth2/v2/auth
GET/oauth2/v2/userinfoGET /oauth2/v2/userinfoGET /oauth2/v2/userinfo
GET/oauth2/v3/certsGET /oauth2/v3/certsGET /oauth2/v3/certs
POST/calendar/v3/freeBusyPOST /calendar/v3/freeBusyPOST /calendar/v3/freeBusy
POST/gmail/v1/users/{userId}/drafts/sendPOST /gmail/v1/users/:userId/drafts/sendPOST /gmail/v1/users/:userId/drafts/send
POST/gmail/v1/users/{userId}/messages/{id}/modifyPOST /gmail/v1/users/:userId/messages/:id/modifyPOST /gmail/v1/users/:userId/messages/:id/modify
POST/gmail/v1/users/{userId}/messages/{id}/trashPOST /gmail/v1/users/:userId/messages/:id/trashPOST /gmail/v1/users/:userId/messages/:id/trash
POST/gmail/v1/users/{userId}/messages/{id}/untrashPOST /gmail/v1/users/:userId/messages/:id/untrashPOST /gmail/v1/users/:userId/messages/:id/untrash
POST/gmail/v1/users/{userId}/messages/batchDeletePOST /gmail/v1/users/:userId/messages/batchDeletePOST /gmail/v1/users/:userId/messages/batchDelete
POST/gmail/v1/users/{userId}/messages/batchModifyPOST /gmail/v1/users/:userId/messages/batchModifyPOST /gmail/v1/users/:userId/messages/batchModify
POST/gmail/v1/users/{userId}/messages/importPOST /gmail/v1/users/:userId/messages/importPOST /gmail/v1/users/:userId/messages/import
POST/gmail/v1/users/{userId}/messages/sendPOST /gmail/v1/users/:userId/messages/sendPOST /gmail/v1/users/:userId/messages/send
POST/gmail/v1/users/{userId}/stopPOST /gmail/v1/users/:userId/stopPOST /gmail/v1/users/:userId/stop
POST/gmail/v1/users/{userId}/threads/{id}/modifyPOST /gmail/v1/users/:userId/threads/:id/modifyPOST /gmail/v1/users/:userId/threads/:id/modify
POST/gmail/v1/users/{userId}/threads/{id}/trashPOST /gmail/v1/users/:userId/threads/:id/trashPOST /gmail/v1/users/:userId/threads/:id/trash
POST/gmail/v1/users/{userId}/threads/{id}/untrashPOST /gmail/v1/users/:userId/threads/:id/untrashPOST /gmail/v1/users/:userId/threads/:id/untrash
POST/gmail/v1/users/{userId}/watchPOST /gmail/v1/users/:userId/watchPOST /gmail/v1/users/:userId/watch
POST/o/oauth2/v2/auth/callbackPOST /o/oauth2/v2/auth/callbackPOST /o/oauth2/v2/auth/callback
POST/oauth2/revokePOST /oauth2/revokePOST /oauth2/revoke
POST/oauth2/tokenPOST /oauth2/tokenPOST /oauth2/token
POST/upload/drive/v3/filesPOST /upload/drive/v3/filesPOST /upload/drive/v3/files
POST/upload/gmail/v1/users/{userId}/draftsPOST /upload/gmail/v1/users/:userId/draftsPOST /upload/gmail/v1/users/:userId/drafts
POST/upload/gmail/v1/users/{userId}/drafts/sendPOST /upload/gmail/v1/users/:userId/drafts/sendPOST /upload/gmail/v1/users/:userId/drafts/send
POST/upload/gmail/v1/users/{userId}/messagesPOST /upload/gmail/v1/users/:userId/messagesPOST /upload/gmail/v1/users/:userId/messages
POST/upload/gmail/v1/users/{userId}/messages/importPOST /upload/gmail/v1/users/:userId/messages/importPOST /upload/gmail/v1/users/:userId/messages/import
POST/upload/gmail/v1/users/{userId}/messages/sendPOST /upload/gmail/v1/users/:userId/messages/sendPOST /upload/gmail/v1/users/:userId/messages/send

Documentation

The package README, the same file that ships in the npm tarball.Edit on GitHub

Local emulators. Real API contracts. Part of Mockingbird.

OAuth authorize, token exchange, userinfo, RS256 OIDC discovery and JWKS, token revocation, Gmail messages/drafts/threads/labels/history/settings, Calendar discovery/lists/events/freebusy, Drive files/uploads. Runs through Mockingbird's portable Fetch runtime with SQLite persistence, namespaces, checkpoints, faults and admin controls.

Install

Shell
npm install @crvouga/mockingbird-service-google

Usage

TypeScript
import { OAuth2Client } from "google-auth-library"
import { createServer } from "@crvouga/mockingbird-service-google/server"

const google = await createServer()

// The application's OAuth client. Only its endpoints change.
const oauth = new OAuth2Client({
  clientId: "client-id",
  clientSecret: "client-secret",
  redirectUri: "http://localhost:3000/callback",
  endpoints: {
    oauth2AuthBaseUrl: `${google.url}/o/oauth2/v2/auth`,
    oauth2TokenUrl: `${google.url}/oauth2/token`,
  },
})
const authUrl = oauth.generateAuthUrl({ scope: ["openid", "email", "profile"] })

// Test control: the seeded user approves on the consent page, as a browser would.
const consent = await fetch(`${google.url}/o/oauth2/v2/auth/callback`, {
  method: "POST",
  redirect: "manual",
  body: new URLSearchParams({
    ...Object.fromEntries(new URL(authUrl).searchParams),
    email: "testuser@gmail.com",
  }),
})
const code = new URL(consent.headers.get("location") ?? "").searchParams.get("code") ?? ""

// The application exchanges the code and reads the profile.
const { tokens } = await oauth.getToken(code)
oauth.setCredentials(tokens)
const me = await oauth.request<{ email: string }>({ url: `${google.url}/oauth2/v2/userinfo` })
console.log(me.data.email) // "testuser@gmail.com"

await google.close()

API

  • GoogleAPI: portable provider instance; accepts SQLite, namespace, clock, fixtures and baseUrl.
  • createRuntime: shared runtime, including native namespace and checkpoint controls.
  • GOOGLE_NAMESPACE: default storage namespace.
  • document, operationIds, supportedOperationIds: registered provider route inventory.
  • createServer, DEFAULT_PORT, serveTarget from /server: loopback listener and CLI configuration.

fixtures accepts synthetic provider seed records. reset() restores defaults. Emulate 0.12.1 is a test oracle only, never a runtime dependency. Vendor handlers ported under Apache-2.0 retain their license and attribution; see LICENSE_EMULATE and THIRD_PARTY_NOTICES.md.

See SUPPORT.md for coverage and limits and API_EVIDENCE.md for validation status.

↑↓ to navigate↵ to open