Files
dss/dss-mvp1/tests/integration/test_figma_mock.py
Digital Production Factory 276ed71f31 Initial commit: Clean DSS implementation
Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm

Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)

Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability

Migration completed: $(date)
🤖 Clean migration with full functionality preserved
2025-12-09 18:45:48 -03:00

173 lines
6.1 KiB
Python

"""Integration tests for Figma wrapper using mock API responses"""
import pytest
from unittest.mock import Mock, patch
from dss.tools.figma import FigmaWrapper, FigmaAPIError
@pytest.mark.integration
class TestFigmaWrapperWithMocks:
"""Test Figma wrapper with mocked API responses"""
def test_init_with_mock_credentials(self, mock_figma_token, mock_figma_file_key):
"""Test initializing FigmaWrapper with mock credentials"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key,
use_cache=False
)
assert wrapper.api_token == mock_figma_token
assert wrapper.file_key == mock_figma_file_key
assert wrapper.headers["X-Figma-Token"] == mock_figma_token
def test_extract_themes_with_mock_response(
self,
mock_figma_token,
mock_figma_file_key,
mock_figma_response
):
"""Test extracting themes from mock Figma response"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key,
use_cache=False
)
# Mock the API call
with patch.object(wrapper, 'get_variables', return_value=mock_figma_response):
themes = wrapper.extract_themes()
# Should extract Light and Dark themes
assert "Light" in themes
assert "Dark" in themes
# Check Light theme has tokens
light_theme = themes["Light"]
assert light_theme.name == "DSS Light"
assert len(light_theme.tokens) > 0
# Check Dark theme has tokens
dark_theme = themes["Dark"]
assert dark_theme.name == "DSS Dark"
assert len(dark_theme.tokens) > 0
def test_build_mode_map(self, mock_figma_token, mock_figma_file_key, mock_figma_response):
"""Test building mode ID to theme name mapping"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key
)
variable_collections = mock_figma_response["meta"]["variableCollections"]
mode_map = wrapper._build_mode_map(variable_collections)
# Should map mode IDs to names
assert "1:0" in mode_map
assert mode_map["1:0"] == "Light"
assert "1:1" in mode_map
assert mode_map["1:1"] == "Dark"
def test_convert_figma_color_to_rgb(self, mock_figma_token, mock_figma_file_key):
"""Test converting Figma color format to RGB"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key
)
# Figma color format: {r: 0-1, g: 0-1, b: 0-1, a: 0-1}
figma_color = {
"r": 0.0,
"g": 0.4,
"b": 0.8,
"a": 1.0
}
rgb_string = wrapper._format_value(figma_color, "color")
# Should convert to rgb(0, 102, 204)
assert "rgb(" in rgb_string
assert "0" in rgb_string # Red component
assert "102" in rgb_string # Green component
assert "204" in rgb_string # Blue component
def test_handle_api_errors(self, mock_figma_token, mock_figma_file_key):
"""Test handling Figma API errors"""
import requests
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key,
use_cache=False
)
# Mock 403 Forbidden error
with patch('requests.get') as mock_get:
mock_response = Mock()
mock_response.status_code = 403
# Properly simulate HTTPError
http_error = requests.exceptions.HTTPError()
http_error.response = mock_response
mock_response.raise_for_status.side_effect = http_error
mock_get.return_value = mock_response
with pytest.raises(FigmaAPIError) as exc_info:
wrapper.get_variables()
assert "Invalid Figma API token" in str(exc_info.value) or "403" in str(exc_info.value)
def test_handle_404_not_found(self, mock_figma_token, mock_figma_file_key):
"""Test handling file not found error"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key,
use_cache=False
)
# Mock 404 Not Found error
with patch('requests.get') as mock_get:
mock_response = Mock()
mock_response.status_code = 404
mock_response.raise_for_status.side_effect = Exception("404 Not Found")
mock_get.return_value = mock_response
with pytest.raises(FigmaAPIError) as exc_info:
wrapper.get_variables()
assert "not found" in str(exc_info.value).lower()
@pytest.mark.integration
class TestFigmaTokenConversion:
"""Test Figma token type conversions"""
def test_map_figma_type_to_dtcg(self, mock_figma_token, mock_figma_file_key):
"""Test mapping Figma types to DTCG types"""
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key
)
assert wrapper._map_figma_type_to_dtcg("COLOR") == "color"
assert wrapper._map_figma_type_to_dtcg("FLOAT") == "number"
assert wrapper._map_figma_type_to_dtcg("STRING") == "string"
assert wrapper._map_figma_type_to_dtcg("BOOLEAN") == "boolean"
assert wrapper._map_figma_type_to_dtcg("UNKNOWN") == "other"
def test_map_dtcg_type_to_category(self, mock_figma_token, mock_figma_file_key):
"""Test mapping DTCG types to DSS categories"""
from dss.models.theme import TokenCategory
wrapper = FigmaWrapper(
api_token=mock_figma_token,
file_key=mock_figma_file_key
)
assert wrapper._map_dtcg_type_to_category("color") == TokenCategory.COLOR
assert wrapper._map_dtcg_type_to_category("dimension") == TokenCategory.SPACING
assert wrapper._map_dtcg_type_to_category("fontSize") == TokenCategory.TYPOGRAPHY
assert wrapper._map_dtcg_type_to_category("shadow") == TokenCategory.SHADOW
assert wrapper._map_dtcg_type_to_category("unknown") == TokenCategory.OTHER