Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
297 changes: 297 additions & 0 deletions scrapegraph-js/examples/mock_mode_example.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,297 @@
/**
* Example demonstrating how to use the ScrapeGraph AI SDK in mock mode.
*
* This example shows how to:
* 1. Enable mock mode globally or per-request
* 2. Use custom mock responses
* 3. Use custom mock handlers
* 4. Test different endpoints in mock mode
* 5. Demonstrate environment variable activation
*
* Requirements:
* - Node.js 16+
* - scrapegraph-js
*
* Usage:
* node mock_mode_example.js
*
* Or with environment variable:
* SGAI_MOCK=1 node mock_mode_example.js
*/

import {
scrape,
getScrapeRequest,
smartScraper,
getSmartScraperRequest,
searchScraper,
getSearchScraperRequest,
markdownify,
getMarkdownifyRequest,
crawl,
getCrawlRequest,
agenticScraper,
getAgenticScraperRequest,
getCredits,
submitFeedback
} from '../index.js';

import {
initMockConfig,
enableMock,
disableMock,
setMockResponses,
setMockHandler
} from '../src/utils/mockConfig.js';

// Configuration
const API_KEY = process.env.SGAI_API_KEY || 'sgai-00000000-0000-0000-0000-000000000000';

/**
* Basic mock mode usage demonstration
*/
async function basicMockUsage() {
console.log('\n=== Basic Mock Usage ===');

// Enable mock mode globally
enableMock();

try {
// Test scrape endpoint
console.log('\n-- Testing scrape endpoint --');
const scrapeResult = await scrape(API_KEY, 'https://example.com', { renderHeavyJs: true });
console.log('Scrape result:', scrapeResult);

// Test getScrapeRequest endpoint
console.log('\n-- Testing getScrapeRequest endpoint --');
const scrapeStatus = await getScrapeRequest(API_KEY, 'mock-request-id');
console.log('Scrape status:', scrapeStatus);

// Test smartScraper endpoint
console.log('\n-- Testing smartScraper endpoint --');
const smartResult = await smartScraper(API_KEY, 'https://example.com', 'Extract the title');
console.log('SmartScraper result:', smartResult);

// Test getCredits endpoint
console.log('\n-- Testing getCredits endpoint --');
const credits = await getCredits(API_KEY);
console.log('Credits:', credits);

// Test submitFeedback endpoint
console.log('\n-- Testing submitFeedback endpoint --');
const feedback = await submitFeedback(API_KEY, 'mock-request-id', 5, 'Great service!');
console.log('Feedback result:', feedback);

} catch (error) {
console.error('Error in basic mock usage:', error.message);
}
}

/**
* Mock mode with custom responses
*/
async function mockWithCustomResponses() {
console.log('\n=== Mock Mode with Custom Responses ===');

// Set custom responses for specific endpoints
setMockResponses({
'/v1/credits': {
remaining_credits: 42,
total_credits_used: 58,
custom_field: 'This is a custom response'
},
'/v1/smartscraper': () => ({
request_id: 'custom-mock-request-id',
custom_data: 'Generated by custom function'
})
});

try {
// Test credits with custom response
console.log('\n-- Testing credits with custom response --');
const credits = await getCredits(API_KEY);
console.log('Custom credits:', credits);

// Test smartScraper with custom response
console.log('\n-- Testing smartScraper with custom response --');
const smartResult = await smartScraper(API_KEY, 'https://example.com', 'Extract data');
console.log('Custom smartScraper result:', smartResult);

} catch (error) {
console.error('Error in custom responses:', error.message);
}
}

/**
* Mock mode with custom handler
*/
async function mockWithCustomHandler() {
console.log('\n=== Mock Mode with Custom Handler ===');

// Set a custom handler that overrides all responses
setMockHandler((method, url) => {
return {
custom_handler: true,
method: method,
url: url,
timestamp: new Date().toISOString(),
message: 'This response was generated by a custom handler'
};
});

try {
// Test various endpoints with custom handler
console.log('\n-- Testing with custom handler --');

const scrapeResult = await scrape(API_KEY, 'https://example.com');
console.log('Scrape with custom handler:', scrapeResult);

const smartResult = await smartScraper(API_KEY, 'https://example.com', 'Test prompt');
console.log('SmartScraper with custom handler:', smartResult);

const credits = await getCredits(API_KEY);
console.log('Credits with custom handler:', credits);

} catch (error) {
console.error('Error in custom handler:', error.message);
}
}

/**
* Per-request mock mode (without global enable)
*/
async function perRequestMockMode() {
console.log('\n=== Per-Request Mock Mode ===');

// Disable global mock mode
disableMock();

try {
// Test individual requests with mock enabled
console.log('\n-- Testing per-request mock mode --');

const scrapeResult = await scrape(API_KEY, 'https://example.com', { mock: true });
console.log('Per-request mock scrape:', scrapeResult);

const smartResult = await smartScraper(API_KEY, 'https://example.com', 'Test', null, null, null, null, { mock: true });
console.log('Per-request mock smartScraper:', smartResult);

const scrapeStatus = await getScrapeRequest(API_KEY, 'test-id', { mock: true });
console.log('Per-request mock getScrapeRequest:', scrapeStatus);

} catch (error) {
console.error('Error in per-request mock mode:', error.message);
}
}

/**
* Test all available endpoints in mock mode
*/
async function testAllEndpoints() {
console.log('\n=== Testing All Endpoints in Mock Mode ===');

enableMock();

try {
// Test all available endpoints
console.log('\n-- Testing all endpoints --');

// Scrape endpoints
const scrapeResult = await scrape(API_KEY, 'https://example.com');
console.log('Scrape:', scrapeResult.request_id ? '✅' : '❌');

const scrapeStatus = await getScrapeRequest(API_KEY, 'mock-id');
console.log('GetScrapeRequest:', scrapeStatus.status ? '✅' : '❌');

// SmartScraper endpoints
const smartResult = await smartScraper(API_KEY, 'https://example.com', 'Extract title');
console.log('SmartScraper:', smartResult.request_id ? '✅' : '❌');

const smartStatus = await getSmartScraperRequest(API_KEY, 'mock-id');
console.log('GetSmartScraperRequest:', smartStatus.status ? '✅' : '❌');

// SearchScraper endpoints
const searchResult = await searchScraper(API_KEY, 'Search for information');
console.log('SearchScraper:', searchResult.request_id ? '✅' : '❌');

const searchStatus = await getSearchScraperRequest(API_KEY, 'mock-id');
console.log('GetSearchScraperRequest:', searchStatus.status ? '✅' : '❌');

// Markdownify endpoints
const markdownResult = await markdownify(API_KEY, 'https://example.com');
console.log('Markdownify:', markdownResult.request_id ? '✅' : '❌');

const markdownStatus = await getMarkdownifyRequest(API_KEY, 'mock-id');
console.log('GetMarkdownifyRequest:', markdownStatus.status ? '✅' : '❌');

// Crawl endpoints
const crawlResult = await crawl(API_KEY, 'https://example.com');
console.log('Crawl:', crawlResult.crawl_id ? '✅' : '❌');

const crawlStatus = await getCrawlRequest(API_KEY, 'mock-id');
console.log('GetCrawlRequest:', crawlStatus.status ? '✅' : '❌');

// AgenticScraper endpoints
const agenticResult = await agenticScraper(API_KEY, 'https://example.com', ['click button']);
console.log('AgenticScraper:', agenticResult.request_id ? '✅' : '❌');

const agenticStatus = await getAgenticScraperRequest(API_KEY, 'mock-id');
console.log('GetAgenticScraperRequest:', agenticStatus.status ? '✅' : '❌');

// Utility endpoints
const credits = await getCredits(API_KEY);
console.log('GetCredits:', credits.remaining_credits ? '✅' : '❌');

const feedback = await submitFeedback(API_KEY, 'mock-id', 5, 'Great!');
console.log('SubmitFeedback:', feedback.status ? '✅' : '❌');

} catch (error) {
console.error('Error testing endpoints:', error.message);
}
}

/**
* Environment variable activation test
*/
async function testEnvironmentActivation() {
console.log('\n=== Environment Variable Activation Test ===');

console.log('Current SGAI_MOCK value:', process.env.SGAI_MOCK || 'not set');

// Reinitialize mock config to check environment
initMockConfig();

try {
const credits = await getCredits(API_KEY);
console.log('Credits with env check:', credits);
} catch (error) {
console.error('Error in environment test:', error.message);
}
}

/**
* Main function to run all examples
*/
async function main() {
console.log('🧪 ScrapeGraph AI SDK - Mock Mode Examples');
console.log('==========================================');

try {
await basicMockUsage();
await mockWithCustomResponses();
await mockWithCustomHandler();
await perRequestMockMode();
await testAllEndpoints();
await testEnvironmentActivation();

console.log('\n✅ All mock mode examples completed successfully!');

} catch (error) {
console.error('\n❌ Error running examples:', error.message);
}
}

// Run the examples
if (import.meta.url === `file://${process.argv[1]}`) {
main();
}
11 changes: 11 additions & 0 deletions scrapegraph-js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,14 @@ export { searchScraper, getSearchScraperRequest } from './src/searchScraper.js';
export { getCredits } from './src/credits.js';
export { sendFeedback } from './src/feedback.js';
export { crawl, getCrawlRequest } from './src/crawl.js';

// Mock utilities
export {
initMockConfig,
enableMock,
disableMock,
setMockResponses,
setMockHandler,
getMockConfig,
isMockEnabled
} from './src/utils/mockConfig.js';
16 changes: 15 additions & 1 deletion scrapegraph-js/src/credits.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@
import axios from 'axios';
import handleError from './utils/handleError.js';
import { isMockEnabled, getMockConfig } from './utils/mockConfig.js';
import { getMockResponse, createMockAxiosResponse } from './utils/mockResponse.js';

/**
* Retrieve credits from the API.
*
* @param {string} apiKey - Your ScrapeGraph AI API key
* @returns {Promise<string>} Response from the API in JSON format
*/
export async function getCredits(apiKey) {
export async function getCredits(apiKey, options = {}) {
const { mock = null } = options;

// Check if mock mode is enabled
const useMock = mock !== null ? mock : isMockEnabled();

if (useMock) {
console.log('🧪 Mock mode active. Returning stub for getCredits');
const mockConfig = getMockConfig();
const mockData = getMockResponse('GET', 'https://api.scrapegraphai.com/v1/credits', mockConfig.customResponses, mockConfig.customHandler);
return mockData;
}

const endpoint = 'https://api.scrapegraphai.com/v1/credits';
const headers = {
'accept': 'application/json',
Expand Down
29 changes: 27 additions & 2 deletions scrapegraph-js/src/scrape.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import axios from 'axios';
import handleError from './utils/handleError.js';
import { isMockEnabled, getMockConfig } from './utils/mockConfig.js';
import { getMockResponse, createMockAxiosResponse } from './utils/mockResponse.js';

/**
* Converts a webpage into HTML format with optional JavaScript rendering.
Expand Down Expand Up @@ -44,9 +46,20 @@ import handleError from './utils/handleError.js';
export async function scrape(apiKey, url, options = {}) {
const {
renderHeavyJs = false,
headers: customHeaders = {}
headers: customHeaders = {},
mock = null
} = options;

// Check if mock mode is enabled
const useMock = mock !== null ? mock : isMockEnabled();

if (useMock) {
console.log('🧪 Mock mode active. Returning stub for scrape request');
const mockConfig = getMockConfig();
const mockData = getMockResponse('POST', 'https://api.scrapegraphai.com/v1/scrape', mockConfig.customResponses, mockConfig.customHandler);
return mockData;
}

const endpoint = 'https://api.scrapegraphai.com/v1/scrape';
const headers = {
'accept': 'application/json',
Expand Down Expand Up @@ -114,7 +127,19 @@ export async function scrape(apiKey, url, options = {}) {
* - CSS styles and formatting
* - Images, links, and other media elements
*/
export async function getScrapeRequest(apiKey, requestId) {
export async function getScrapeRequest(apiKey, requestId, options = {}) {
const { mock = null } = options;

// Check if mock mode is enabled
const useMock = mock !== null ? mock : isMockEnabled();

if (useMock) {
console.log('🧪 Mock mode active. Returning stub for getScrapeRequest');
const mockConfig = getMockConfig();
const mockData = getMockResponse('GET', `https://api.scrapegraphai.com/v1/scrape/${requestId}`, mockConfig.customResponses, mockConfig.customHandler);
return mockData;
}

const endpoint = 'https://api.scrapegraphai.com/v1/scrape/' + requestId;
const headers = {
'accept': 'application/json',
Expand Down
Loading
Loading