Skip to main content
Glama

OmniMCP

by OpenAdaptAI
# tests/test_omnimcp.py """Tests for OmniParser deployment functionality (E2E).""" import pytest import time import boto3 import requests from typing import List from omnimcp.omniparser.server import Deploy from omnimcp.config import config # Import from the new location inside the package # --- Helper Function --- def get_running_parser_instances() -> List[dict]: """Get any running OmniParser instances.""" ec2 = boto3.resource("ec2", region_name=config.AWS_REGION) instances = list( ec2.instances.filter( Filters=[ {"Name": "tag:Name", "Values": [config.PROJECT_NAME]}, {"Name": "instance-state-name", "Values": ["running"]}, ] ) ) running_instances = [] for instance in instances: if instance.public_ip_address: url = f"http://{instance.public_ip_address}:{config.PORT}/probe/" try: response = requests.get(url, timeout=5) if response.status_code == 200: running_instances.append( { "id": instance.id, "ip": instance.public_ip_address, "url": f"http://{instance.public_ip_address}:{config.PORT}", } ) except requests.exceptions.RequestException: pass # Ignore instances that don't respond to probe return running_instances # --- Helper Function --- def cleanup_parser_instances(): """Stop all running parser instances.""" print("\nAttempting cleanup via Deploy.stop()...") try: Deploy.stop() print("Deploy.stop() executed.") except Exception as e: print(f"Error during Deploy.stop(): {e}") # --- Fixture --- # TODO: Fix fixture import/scoping issue (AttributeError previously) # For now, tests needing this image will load it directly or use another fixture. # @pytest.fixture(scope="module") # def test_image(): # """Generate synthetic test image.""" # # This call caused AttributeError during collection previously # img, _ = generate_test_ui() # return img # --- Test Class --- @pytest.mark.e2e # Mark this whole class as end-to-end class TestParserDeployment: """Test suite for OmniParser deployment scenarios.""" @classmethod def setup_class(cls): """Initial setup for all tests.""" # Cleanup before starting tests for this class print("\n--- TestParserDeployment Setup ---") print("Cleaning up any potentially running instances before tests...") cleanup_parser_instances() # Wait after cleanup to ensure resources are gone before tests start needing them print("Waiting after pre-test cleanup...") time.sleep(30) cls.initial_instances = get_running_parser_instances() print(f"Initial running instances before tests: {len(cls.initial_instances)}") @classmethod def teardown_class(cls): """Cleanup after all tests in this class.""" print("\n--- TestParserDeployment Teardown ---") cleanup_parser_instances() print("Waiting after post-test cleanup...") time.sleep(10) final_instances = get_running_parser_instances() print(f"Final running instances after cleanup: {len(final_instances)}") # Asserting exactly 0 might fail if other non-test instances exist # Focus on whether instances created *by the tests* were removed. # This teardown ensures cleanup runs even if tests fail. # TODO: Fix test imports/logic (previously failed collection) - Commented out for now # @pytest.mark.skipif(False, reason="Temporarily enable, ensure cleanup runs first") # def test_auto_deployment(self, test_image): # Requires test_image fixture to work # """Test client auto-deploys when no instance exists.""" # print("\nTesting auto-deployment...") # running_instances = get_running_parser_instances() # assert len(running_instances) == 0, "Test requires no running instances at start" # # print("Initializing client to trigger auto-deployment...") # deployment_start = time.time() # client = None # try: # client = OmniParserClient(server_url=None, auto_deploy=True) # except Exception as e: # pytest.fail(f"OmniParserClient initialization failed during auto-deploy: {e}") # deployment_time = time.time() - deployment_start # print(f"Client initialization (inc. deployment) took {deployment_time:.1f} seconds") # # running_instances = get_running_parser_instances() # assert len(running_instances) >= 1, f"Expected >=1 running instance, found {len(running_instances)}" # assert client and client.server_url is not None, "Client failed to get server URL" # # print(f"Parsing image using deployed server: {client.server_url}") # result = client.parse_image(test_image) # Use the fixture # assert result is not None, "Parse result None" # assert "error" not in result, f"Parsing failed: {result.get('error')}" # assert "parsed_content_list" in result, "Result missing parsed content" # TODO: Fix test imports/logic (previously failed collection) - Commented out for now # def test_use_existing_deployment(self, test_image): # Requires test_image fixture # """Test client uses existing deployment if available.""" # print("\nTesting use of existing deployment...") # running_instances = get_running_parser_instances() # if not running_instances: # print("No running instance found, deploying one...") # ip, id = Deploy.start() # assert ip and id, "Deploy.start() failed to return IP/ID" # print("Waiting 60s for server to stabilize after deployment...") # Longer wait # time.sleep(60) # running_instances = get_running_parser_instances() # # assert running_instances, "Test requires at least one running instance" # # initial_instance = running_instances[0] # initial_url = initial_instance['url'] # print(f"Using existing instance: {initial_url}") # # # Instantiate client WITH the existing URL, disable auto_deploy # client = OmniParserClient(server_url=initial_url, auto_deploy=False) # start_time = time.time() # result = client.parse_image(test_image) # Use fixture # operation_time = time.time() - start_time # # current_instances = get_running_parser_instances() # assert len(current_instances) == len(running_instances), "Instance count changed" # assert result is not None, "Parse result None" # assert "error" not in result, f"Parsing failed: {result.get('error')}" # assert "parsed_content_list" in result, "Result missing parsed content" # print(f"Parse operation with existing deployment took {operation_time:.1f} seconds") # TODO: Fix test imports/logic (previously failed collection) - Commented out for now # def test_deployment_idempotency(self, test_image): # Requires test_image fixture # """Test multiple Deploy.start calls don't create duplicate running instances.""" # print("\nTesting deployment idempotency...") # initial_instances = get_running_parser_instances() # if not initial_instances: # print("No initial instance, running Deploy.start() once...") # Deploy.start() # time.sleep(60) # Wait # initial_instances = get_running_parser_instances() # assert initial_instances, "Failed to start initial instance" # initial_count = len(initial_instances) # print(f"Initial running instance count: {initial_count}") # # for i in range(2): # Attempt start twice more # print(f"Deployment attempt {i + 1}") # ip, id = Deploy.start() # Should find existing running instance # assert ip and id, f"Deploy.start() failed on attempt {i+1}" # time.sleep(5) # current_instances = get_running_parser_instances() # print(f"Instance count after attempt {i + 1}: {len(current_instances)}") # assert len(current_instances) == initial_count, "Idempotency failed: instance count changed" # # # Verify client works # final_instances = get_running_parser_instances() # assert final_instances, "No instances running after idempotency test" # client = OmniParserClient(server_url=final_instances[0]["url"], auto_deploy=False) # result = client.parse_image(test_image) # Use fixture # assert result is not None, "Parse operation failed after idempotency checks" # assert "error" not in result, f"Parsing failed: {result.get('error')}" # Keep if needed for running file directly, though usually rely on `pytest` command # if __name__ == "__main__": # pytest.main([__file__, "-v", "--run-e2e"])

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OpenAdaptAI/OmniMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server