56 lines
2.8 KiB
Python
56 lines
2.8 KiB
Python
import json
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
from redflare.core.models import Target
|
|
from redflare.modules.base import ModuleContext
|
|
from redflare.modules.browser import NativeBrowserRuntimeModule
|
|
from redflare.modules.http import HTTPResponse
|
|
from redflare.modules.noauth import NativeNoAuthModule
|
|
from redflare.modules.repository import normalize_repository, run_repository_intelligence
|
|
|
|
|
|
class NativeModuleTests(unittest.TestCase):
|
|
def test_repository_slug_normalization(self):
|
|
self.assertEqual(normalize_repository("owner/repository"), "owner/repository")
|
|
with self.assertRaises(ValueError): normalize_repository("repository")
|
|
|
|
@patch("redflare.modules.browser.NativeBrowserRuntimeModule._capture", side_effect=RuntimeError("fixture"))
|
|
@patch("redflare.modules.browser.request")
|
|
def test_browser_runtime_has_native_fallback(self, get, _capture):
|
|
get.return_value = HTTPResponse("https://example.test", 200, {}, b"fixture")
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
context = ModuleContext("run", Path(directory))
|
|
result = NativeBrowserRuntimeModule().run(Target("https://example.test", "example.test", "https", 443), context)
|
|
self.assertEqual(result.status, "completed")
|
|
self.assertEqual(result.observations["engine"], "native-http-fallback")
|
|
|
|
@patch("redflare.modules.noauth.time.sleep")
|
|
@patch("redflare.modules.noauth.request")
|
|
def test_noauth_module_emits_native_finding(self, get, _sleep):
|
|
get.return_value = HTTPResponse("https://example.test/admin", 200, {"content-type": "text/html"}, b"admin console")
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
context = ModuleContext("run", Path(directory), rate=0)
|
|
result = NativeNoAuthModule().run(Target("https://example.test", "example.test", "https", 443), context)
|
|
self.assertGreater(len(result.findings), 0)
|
|
self.assertEqual(result.observations["engine"], "native-redflare")
|
|
|
|
@patch("redflare.modules.repository._github")
|
|
@patch.dict("os.environ", {"GITHUB_TOKEN": "fixture-token"})
|
|
def test_repository_intelligence_masks_findings(self, github):
|
|
github.side_effect = [
|
|
{"default_branch": "main"},
|
|
{"tree": [{"type": "blob", "path": "config.js", "sha": "abc", "size": 100}]},
|
|
{"encoding": "base64", "content": "YXBpX2tleSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI="},
|
|
]
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
result = run_repository_intelligence(["owner/repo"], Path(directory))
|
|
data = json.loads(Path(result["output"]).read_text())
|
|
self.assertEqual(result["engine"], "native-redflare")
|
|
self.assertNotIn("abcdefghijklmnopqrstuvwxyz", json.dumps(data))
|
|
|
|
|
|
if __name__ == "__main__": unittest.main()
|