nylas-mock

Crates.ionylas-mock
lib.rsnylas-mock
version0.1.1
created_at2025-12-27 22:24:45.770182+00
updated_at2025-12-28 07:09:01.452643+00
descriptionTesting utilities for Nylas SDK
homepage
repositoryhttps://github.com/mqasimca/nylas-rust
max_upload_size
id2007932
size65,210
Qasim (mqasimca)

documentation

README

nylas-mock

Testing utilities and mock data for the Nylas SDK.

This crate provides test fixtures, mock data, and utilities for testing applications that use the Nylas Rust SDK.

Features

  • ✅ Pre-built mock responses for all Nylas API endpoints
  • wiremock integration for HTTP mocking
  • ✅ Test fixtures for common scenarios
  • ✅ Helper functions for test setup
  • ✅ Realistic sample data

Usage

Add this to your Cargo.toml dev-dependencies:

[dev-dependencies]
nylas-mock = "0.1"
wiremock = "0.5"
tokio = { version = "1.35", features = ["full"] }

Example

use nylas_mock::mocks;
use wiremock::{MockServer, Mock, ResponseTemplate};
use wiremock::matchers::{method, path};

#[tokio::test]
async fn test_list_messages() {
    // Start mock server
    let mock_server = MockServer::start().await;

    // Setup mock response
    Mock::given(method("GET"))
        .and(path("/v3/grants/grant_123/messages"))
        .respond_with(ResponseTemplate::new(200)
            .set_body_json(mocks::messages::list_response()))
        .mount(&mock_server)
        .await;

    // Create client pointing to mock server
    let client = nylas_sdk::NylasClientBuilder::new("test_key")
        .base_url(&mock_server.uri())
        .build()
        .unwrap();

    // Test your code
    let grant_id = nylas_sdk::GrantId::new("grant_123");
    let messages = client.messages().list(&grant_id, None).await.unwrap();

    assert_eq!(messages.len(), 3);
}

Mock Data Modules

Messages

use nylas_mock::mocks::messages;

// Pre-built mock responses
let list_response = messages::list_response();
let single_message = messages::message();
let sent_message = messages::sent_message();

Events

use nylas_mock::mocks::events;

let list_response = events::list_response();
let event = events::event();
let created_event = events::created_event();

Calendars

use nylas_mock::mocks::calendars;

let list_response = calendars::list_response();
let calendar = calendars::calendar();
let availability = calendars::availability_response();

Contacts

use nylas_mock::mocks::contacts;

let list_response = contacts::list_response();
let contact = contacts::contact();

Custom Mock Responses

You can customize mock responses for specific test scenarios:

use serde_json::json;
use wiremock::{Mock, ResponseTemplate};

Mock::given(method("POST"))
    .and(path("/v3/grants/grant_123/messages/send"))
    .respond_with(ResponseTemplate::new(200).set_body_json(json!({
        "id": "custom_message_id",
        "grant_id": "grant_123",
        "subject": "Custom Subject",
        "from": [{
            "email": "sender@example.com",
            "name": "Sender"
        }],
        "to": [{
            "email": "recipient@example.com",
            "name": "Recipient"
        }],
        "date": 1234567890
    })))
    .mount(&mock_server)
    .await;

Error Scenarios

Test error handling with mock error responses:

use wiremock::{Mock, ResponseTemplate};

// Rate limit error
Mock::given(method("GET"))
    .and(path("/v3/grants/grant_123/messages"))
    .respond_with(ResponseTemplate::new(429)
        .insert_header("Retry-After", "60")
        .set_body_json(json!({
            "type": "rate_limit_error",
            "message": "Rate limit exceeded"
        })))
    .mount(&mock_server)
    .await;

// Authentication error
Mock::given(method("GET"))
    .and(path("/v3/grants/grant_123/messages"))
    .respond_with(ResponseTemplate::new(401)
        .set_body_json(json!({
            "type": "authentication_error",
            "message": "Invalid API key"
        })))
    .mount(&mock_server)
    .await;

Pagination Mocking

Mock paginated responses:

use nylas_mock::mocks::pagination;

// First page with next token
Mock::given(method("GET"))
    .and(path("/v3/grants/grant_123/messages"))
    .respond_with(ResponseTemplate::new(200)
        .set_body_json(pagination::page_with_next_token(
            messages::message(),
            "next_page_token_123"
        )))
    .mount(&mock_server)
    .await;

// Second page (final)
Mock::given(method("GET"))
    .and(path("/v3/grants/grant_123/messages"))
    .and(query_param("page_token", "next_page_token_123"))
    .respond_with(ResponseTemplate::new(200)
        .set_body_json(pagination::final_page(messages::message())))
    .mount(&mock_server)
    .await;

Test Helpers

use nylas_mock::helpers;

// Create test client with mock server
let (client, mock_server) = helpers::create_test_client().await;

// Setup standard mocks
helpers::setup_auth_mocks(&mock_server).await;
helpers::setup_message_mocks(&mock_server).await;

// Common test data
let grant_id = helpers::test_grant_id();
let message_id = helpers::test_message_id();

Documentation

License

MIT

Commit count: 0

cargo fmt