ImapKit은 메일 클라이언트 테스트 안에서 실행되는 인메모리 IMAP 서버다. 실제 소켓을 통해 IMAP으로 통신하며, 테스트가 서버 상태를 바꾸고 클라이언트가 변경을 처리하는지 확인할 수 있다.

  • 엄격한 규칙 적용: RFC를 위반하는 클라이언트 입력에는 BAD 또는 NO를 반환해 클라이언트 버그가 운영 서버가 아닌 테스트에서 드러나게 한다.
  • 50개 이상의 확장: IDLE, CONDSTORE, QRESYNC, NOTIFY, ACL, METADATA, QUOTA, SORT, THREAD, COMPRESS 등을 포함한 IMAP4rev1과 IMAP4rev2 확장을 서버별로 켤 수 있다.
  • 제어 API: server.control로 메시지를 추가하고 플래그를 바꾸거나 UIDVALIDITY를 초기화하고 세션 연결을 끊을 수 있다. 연결된 클라이언트에는 모든 변경 사항이 전달된다.
  • 스크립트 오류 주입: 규칙과 동작 프리셋으로 지연 응답, 분할 출력, 속도 제한, 자동 로그아웃, 연결 끊김 등 실제 서버에서 발생하는 상황을 재현한다.
  • 여러 세션: 하나의 편지함에 연결된 여러 클라이언트에 RFC 2180이 허용하는 시점에 EXISTS, EXPUNGE, 플래그 업데이트를 전달한다.
  • 언어에 관계없이 사용: REST API와 서버 이벤트를 제공하는 imapkit 명령을 실행해 Python, Go 등으로 작성한 테스트 도구에서 제어할 수 있다.

ImapKit은 테스트 스위트와 같은 프로세스에서 실행되며 밀리초 단위로 시작하고 디스크에는 데이터를 저장하지 않는다. 각 테스트는 필요한 편지함, 메시지, 사용자, 확장만 갖춘 새 서버를 사용한다. 클라이언트 테스트 작성 안내에는 다음 예제가 실려 있다.

client.test.jsimport imapkit from 'imapkit';const server = imapkit({ plugins: ['IDLE', 'CONDSTORE', 'QRESYNC'] });const port = await server.start();server.control.addMessage('INBOX', { raw: 'Subject: hello\r\n\r\nHi!\r\n' });server.control.resetUidValidity('INBOX', { uids: 'shuffle', seed: 1 });server.script.add({ on: 'command', command: 'SELECT', times: 1, send: '$TAG NO [UNAVAILABLE] Try again\r\n' });await server.stop();