From 3391ff76b6c6e744892fe3ca9368f7bb5f31cf26 Mon Sep 17 00:00:00 2001 From: santiagosayshey Date: Thu, 15 Aug 2024 16:29:14 +0930 Subject: [PATCH] tests(regex): Improve testing functionality for regex. - Add sample unit tests - Add case insensitivity --- backend/app/routes/regex_routes.py | 32 ++++- backend/regex_patterns/3_d-z0n3.yml | 4 +- frontend/src/App.jsx | 1 + frontend/src/components/regex/RegexModal.jsx | 139 ++++++++++++------- 4 files changed, 119 insertions(+), 57 deletions(-) diff --git a/backend/app/routes/regex_routes.py b/backend/app/routes/regex_routes.py index 1e7e3bb..ad08e75 100644 --- a/backend/app/routes/regex_routes.py +++ b/backend/app/routes/regex_routes.py @@ -14,15 +14,37 @@ def regex101_proxy(): logging.debug(f"Received data from frontend: {request.json}") # Validate the request data before sending - required_fields = ['regex', 'flags', 'delimiter', 'flavor'] + required_fields = ['regex', 'delimiter', 'flavor'] for field in required_fields: if field not in request.json: logging.error(f"Missing required field: {field}") return jsonify({"error": f"Missing required field: {field}"}), 400 - # Ensure testString is present - if 'testString' not in request.json or not request.json['testString']: - request.json['testString'] = "Sample test string" # Add a default test string + # Set default flags to 'gmi' for global, multiline, and case-insensitive matching + request.json['flags'] = 'gmi' + + # Include a separate test string if not provided + if 'testString' not in request.json: + request.json['testString'] = "Sample test string" + + # Always include unit tests with every request + request.json['unitTests'] = [ + { + "description": "Sample DOES_MATCH test", + "testString": request.json['testString'], # Use the main test string + "criteria": "DOES_MATCH", + "target": "REGEX" + }, + { + "description": "Sample DOES_NOT_MATCH test", + "testString": "Non-matching string", # This should not match the regex + "criteria": "DOES_NOT_MATCH", + "target": "REGEX" + } + ] + + # Log the complete payload before sending + logging.debug(f"Final payload being sent to Regex101 API: {json.dumps(request.json, indent=2)}") # Construct the data payload for curl data = json.dumps(request.json) @@ -45,6 +67,8 @@ def regex101_proxy(): logging.error(f"An unexpected error occurred: {str(e)}") return jsonify({"error": "An unexpected error occurred"}), 500 + + @bp.route('', methods=['GET', 'POST']) def handle_items(): if request.method == 'POST': diff --git a/backend/regex_patterns/3_d-z0n3.yml b/backend/regex_patterns/3_d-z0n3.yml index d8a16f5..c57ddef 100644 --- a/backend/regex_patterns/3_d-z0n3.yml +++ b/backend/regex_patterns/3_d-z0n3.yml @@ -5,6 +5,6 @@ tags: - Release Group - HDB Internal pattern: (?<=^|[\s.-])D-Z0N3\b -regex101Link: '' +regex101Link: https://regex101.com/r/OWv3R9 date_created: '2024-08-15T15:37:02.733456' -date_modified: '2024-08-15T15:38:23.541760' +date_modified: '2024-08-15T16:24:11.809191' diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 718f176..5644bae 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -27,6 +27,7 @@ function App() { {activeTab === 'regex' ? : } + ); } diff --git a/frontend/src/components/regex/RegexModal.jsx b/frontend/src/components/regex/RegexModal.jsx index 9962f95..626d4cb 100644 --- a/frontend/src/components/regex/RegexModal.jsx +++ b/frontend/src/components/regex/RegexModal.jsx @@ -11,6 +11,7 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) { const [newTag, setNewTag] = useState(''); const [regex101Link, setRegex101Link] = useState(''); const [error, setError] = useState(''); + const [isLoading, setIsLoading] = useState(false); const initialRegexRef = useRef(regex); useEffect(() => { @@ -31,41 +32,72 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) { } setError(''); setNewTag(''); + setIsLoading(false); } }, [regex, isOpen]); const handleCreateRegex101Link = async () => { + if (!pattern.trim()) { + setError('Please provide a regex pattern before creating tests.'); + return; + } + + // Define your unit tests here + const unitTests = [ + { + description: "Test if 'D-Z0N3' is detected correctly", + testString: "Test D-Z0N3 pattern", + criteria: "DOES_MATCH", + target: "REGEX" + }, + { + description: "Test if 'random text' does not match", + testString: "random text", + criteria: "DOES_NOT_MATCH", + target: "REGEX" + } + // Add more unit tests as needed + ]; + + setIsLoading(true); try { - const response = await createRegex101Link({ - regex: pattern, - flavor: 'pcre', - flags: 'gm', - delimiter: '/', - }); - const permalinkFragment = response.permalinkFragment; + const response = await createRegex101Link({ + regex: pattern, + flavor: 'pcre', + flags: 'gmi', + delimiter: '/', + unitTests: unitTests + }); + const permalinkFragment = response.permalinkFragment; - const regex101Link = `https://regex101.com/r/${permalinkFragment}`; - setRegex101Link(regex101Link); + const regex101Link = `https://regex101.com/r/${permalinkFragment}`; + setRegex101Link(regex101Link); - await saveRegex({ - id: regex ? regex.id : 0, - name, - pattern, - description, - tags, - regex101Link, - }); + await saveRegex({ + id: regex ? regex.id : 0, + name, + pattern, + description, + tags, + regex101Link, + }); - window.open(regex101Link, '_blank'); - onSave(); // Refresh the list after saving - setError(''); + window.open(regex101Link, '_blank'); + onSave(); // Refresh the list after saving + setError(''); } catch (error) { - console.error('Error creating regex101 link:', error); - setError('Failed to create regex101 link. Please try again.'); + console.error('Error creating regex101 link:', error); + setError('Failed to create regex101 link. Please try again.'); + } finally { + setIsLoading(false); } }; const handleRemoveRegex101Link = async () => { + const confirmRemoval = window.confirm("Are you sure you want to remove this Regex101 link?"); + if (!confirmRemoval) return; + + setIsLoading(true); setRegex101Link(''); // Clear the regex101Link in state try { @@ -83,12 +115,14 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) { } catch (error) { console.error('Error removing regex101 link:', error); setError('Failed to remove regex101 link. Please try again.'); + } finally { + setIsLoading(false); } }; const handleSave = async () => { - if (!name.trim() || !pattern.trim() || !description.trim()) { - setError('Name, pattern, and description are all required.'); + if (!name.trim() || !pattern.trim()) { + setError('Name and pattern are required.'); return; } try { @@ -109,15 +143,16 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) { }; const handleDelete = async () => { - if (regex && regex.id) { - try { - await deleteRegex(regex.id); - onSave(); - onClose(); - } catch (error) { - console.error('Error deleting regex:', error); - setError('Failed to delete regex. Please try again.'); - } + const confirmDeletion = window.confirm("Are you sure you want to delete this regex?"); + if (!confirmDeletion) return; + + try { + await deleteRegex(regex.id); + onSave(); + onClose(); + } catch (error) { + console.error('Error deleting regex:', error); + setError('Failed to delete regex. Please try again.'); } }; @@ -165,7 +200,7 @@ function RegexModal({ regex = null, isOpen, onClose, onSave }) {
{regex101Link ? ( <> -

- - Open in Regex101 - -

- +
+
+ + +
+
) : ( )}