From d6b20aa749ea7725bd277259be7b63e0c7d75bf1 Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:05:38 +0000 Subject: [PATCH 1/3] Initial empty commit to create PR From 1f991935332d851ae6366da74a741fe3fc565834 Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:07:00 +0000 Subject: [PATCH 2/3] Replace content of services/github/files/test_get_eslint_config.py [skip ci] --- .../github/files/test_get_eslint_config.py | 340 +++++++++++++++++- 1 file changed, 327 insertions(+), 13 deletions(-) diff --git a/services/github/files/test_get_eslint_config.py b/services/github/files/test_get_eslint_config.py index 8bb2b07b5..693d8313c 100644 --- a/services/github/files/test_get_eslint_config.py +++ b/services/github/files/test_get_eslint_config.py @@ -3,10 +3,8 @@ from unittest.mock import patch import pytest - from services.github.files.get_eslint_config import get_eslint_config - REAL_CUSTOMER_ESLINTRC = """{ "parser": "@typescript-eslint/parser", "env": { @@ -64,6 +62,97 @@ def base_args(): } +def test_get_eslint_config_finds_eslintrc_json(base_args): + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.json": + return REAL_CUSTOMER_ESLINTRC + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.json" + assert result["content"] == REAL_CUSTOMER_ESLINTRC + + +def test_get_eslint_config_finds_eslintrc_js(base_args): + eslintrc_js = """module.exports = { + parser: '@typescript-eslint/parser', + rules: { + 'no-console': 'warn' + } +};""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.js": + return eslintrc_js + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.js" + assert result["content"] == eslintrc_js + + +def test_get_eslint_config_finds_eslintrc_yml(base_args): + eslintrc_yml = """parser: '@typescript-eslint/parser' +rules: + no-console: warn""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.yml": + return eslintrc_yml + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.yml" + assert result["content"] == eslintrc_yml + + +def test_get_eslint_config_finds_eslintrc_yaml(base_args): + eslintrc_yaml = """parser: '@typescript-eslint/parser' +rules: + no-console: error""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.yaml": + return eslintrc_yaml + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.yaml" + assert result["content"] == eslintrc_yaml + + def test_get_eslint_config_finds_eslintrc(base_args): with patch( "services.github.files.get_eslint_config.get_raw_content" @@ -87,14 +176,21 @@ def side_effect(owner, repo, file_path, ref, token): assert "simple-import-sort/imports" in config["rules"] -def test_get_eslint_config_finds_eslintrc_json(base_args): +def test_get_eslint_config_finds_eslint_config_js(base_args): + eslint_config_js = """export default { + parser: '@typescript-eslint/parser', + rules: { + 'no-console': 'warn' + } +};""" + with patch( "services.github.files.get_eslint_config.get_raw_content" ) as mock_get_raw: def side_effect(owner, repo, file_path, ref, token): - if file_path == ".eslintrc.json": - return REAL_CUSTOMER_ESLINTRC + if file_path == "eslint.config.js": + return eslint_config_js return None mock_get_raw.side_effect = side_effect @@ -102,14 +198,15 @@ def side_effect(owner, repo, file_path, ref, token): result = get_eslint_config(base_args) assert result is not None - assert result["filename"] == ".eslintrc.json" + assert result["filename"] == "eslint.config.js" + assert result["content"] == eslint_config_js -def test_get_eslint_config_finds_eslintrc_js(base_args): - eslintrc_js = """module.exports = { +def test_get_eslint_config_finds_eslint_config_mjs(base_args): + eslint_config_mjs = """export default { parser: '@typescript-eslint/parser', rules: { - 'no-console': 'warn' + 'no-console': 'error' } };""" @@ -118,8 +215,8 @@ def test_get_eslint_config_finds_eslintrc_js(base_args): ) as mock_get_raw: def side_effect(owner, repo, file_path, ref, token): - if file_path == ".eslintrc.js": - return eslintrc_js + if file_path == "eslint.config.mjs": + return eslint_config_mjs return None mock_get_raw.side_effect = side_effect @@ -127,8 +224,34 @@ def side_effect(owner, repo, file_path, ref, token): result = get_eslint_config(base_args) assert result is not None - assert result["filename"] == ".eslintrc.js" - assert result["content"] == eslintrc_js + assert result["filename"] == "eslint.config.mjs" + assert result["content"] == eslint_config_mjs + + +def test_get_eslint_config_finds_eslint_config_cjs(base_args): + eslint_config_cjs = """module.exports = { + parser: '@typescript-eslint/parser', + rules: { + 'no-console': 'off' + } +};""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == "eslint.config.cjs": + return eslint_config_cjs + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == "eslint.config.cjs" + assert result["content"] == eslint_config_cjs def test_get_eslint_config_finds_in_package_json(base_args): @@ -162,6 +285,31 @@ def side_effect(owner, repo, file_path, ref, token): assert config["rules"]["no-console"] == "error" +def test_get_eslint_config_package_json_without_eslint_config(base_args): + package_json_content = """{ + "name": "test-package", + "version": "1.0.0", + "dependencies": { + "eslint": "^8.0.0" + } +}""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == "package.json": + return package_json_content + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is None + + def test_get_eslint_config_not_found(base_args): with patch( "services.github.files.get_eslint_config.get_raw_content" @@ -173,6 +321,26 @@ def test_get_eslint_config_not_found(base_args): assert result is None +def test_get_eslint_config_priority_order(base_args): + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.js": + return "module.exports = { rules: {} };" + if file_path == "package.json": + return '{"eslintConfig": {"rules": {}}}' + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.js" + + def test_get_eslint_config_tries_all_config_files(base_args): with patch( "services.github.files.get_eslint_config.get_raw_content" @@ -183,3 +351,149 @@ def test_get_eslint_config_tries_all_config_files(base_args): assert result is None assert mock_get_raw.call_count >= 8 + + +def test_get_eslint_config_with_empty_package_json(base_args): + package_json_content = "{}" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == "package.json": + return package_json_content + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is None + + +def test_get_eslint_config_with_complex_eslint_config_in_package_json(base_args): + package_json_content = """{ + "name": "complex-package", + "version": "2.0.0", + "eslintConfig": { + "parser": "@typescript-eslint/parser", + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "no-console": "warn", + "@typescript-eslint/no-unused-vars": "error" + }, + "env": { + "node": true, + "es6": true + } + } +}""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == "package.json": + return package_json_content + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == "package.json" + + config = json.loads(result["content"]) + assert config["parser"] == "@typescript-eslint/parser" + assert "eslint:recommended" in config["extends"] + assert config["rules"]["no-console"] == "warn" + assert config["env"]["node"] is True + + +def test_get_eslint_config_handles_exception_gracefully(base_args): + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + mock_get_raw.side_effect = Exception("Network error") + + result = get_eslint_config(base_args) + + assert result is None + + +def test_get_eslint_config_handles_json_decode_error(base_args): + invalid_json = "{ invalid json content" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == "package.json": + return invalid_json + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is None + + +def test_get_eslint_config_first_found_wins(base_args): + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + + def side_effect(owner, repo, file_path, ref, token): + if file_path == ".eslintrc.json": + return '{"rules": {"no-console": "error"}}' + if file_path == ".eslintrc.js": + return "module.exports = { rules: {} };" + if file_path == ".eslintrc": + return '{"rules": {}}' + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == ".eslintrc.json" + + +def test_get_eslint_config_skips_to_package_json_when_no_config_files(base_args): + package_json_content = """{ + "name": "test-package", + "eslintConfig": { + "rules": { + "no-console": "warn" + } + } +}""" + + with patch( + "services.github.files.get_eslint_config.get_raw_content" + ) as mock_get_raw: + call_count = 0 + + def side_effect(owner, repo, file_path, ref, token): + nonlocal call_count + call_count += 1 + if file_path == "package.json": + return package_json_content + return None + + mock_get_raw.side_effect = side_effect + + result = get_eslint_config(base_args) + + assert result is not None + assert result["filename"] == "package.json" + assert call_count == 9 From f068750ea9e90b3e0ef1707f80c53fb436663697 Mon Sep 17 00:00:00 2001 From: "gitauto-ai[bot]" <161652217+gitauto-ai[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:07:47 +0000 Subject: [PATCH 3/3] Empty commit to trigger final tests