{ lib, pkgs, }: let codingRulesLib = (import ../../lib {inherit lib;}).coding-rules; # Test 1: instructions are generated correctly with custom rulesDir testInstructions = let rules = codingRulesLib.mkCodingRules { agents = "/tmp/fake-agents"; languages = ["python"]; concerns = ["naming"]; rulesDir = ".coding-rules"; }; in assert rules.instructions == [ ".coding-rules/concerns/naming.md" ".coding-rules/languages/python.md" ]; "pass: instructions"; # Test 2: default rulesDir is .opencode-rules testDefaultRulesDir = let rules = codingRulesLib.mkCodingRules { agents = "/tmp/fake-agents"; }; hasCorrectPrefix = builtins.all (s: builtins.substring 0 15 s == ".opencode-rules") rules.instructions; in assert hasCorrectPrefix == true; "pass: default rulesDir"; # Test 3: shellHook contains both the symlink command and the config generation testShellHook = let rules = codingRulesLib.mkCodingRules { agents = "/tmp/fake-agents"; }; hook = rules.shellHook; hasSymlink = builtins.match ".*ln -sfn.*" hook != null; hasConfigGen = builtins.match ".*coding-rules.json.*" hook != null; in assert hasSymlink; assert hasConfigGen; "pass: shellHook"; # Test 4: forPi=false does not include AGENTS.md logic in shellHook testForPiDisabled = let rules = codingRulesLib.mkCodingRules { agents = "/tmp/fake-agents"; forPi = false; }; hook = rules.shellHook; hasPiBlock = builtins.match ".*CODING-RULES:START.*" hook != null; in assert hasPiBlock == false; "pass: forPi disabled"; # Test 5: mkRulesMdSection produces empty string for empty concerns testEmptyRulesMdSection = let section = codingRulesLib.mkRulesMdSection { agents = "/tmp/fake-agents"; concerns = []; languages = []; frameworks = []; }; in assert section == ""; "pass: empty mkRulesMdSection"; # Test 6: mkRulesMdSection wraps content with markers testRulesMdSection = let # Use a simple file path that won't be read (concatRulesMd returns empty # when files don't exist, so we just verify the function is callable) section = codingRulesLib.mkRulesMdSection { agents = "/tmp/fake-agents"; concerns = []; languages = []; frameworks = []; }; # After fix: mkRulesMdSection returns "" for empty rules, not a string with markers in assert section == ""; "pass: mkRulesMdSection empty case"; in pkgs.runCommand "lib-coding-rules-tests" {} '' echo "Running lib coding-rules tests..." echo "1. ${testInstructions}" echo "2. ${testDefaultRulesDir}" echo "3. ${testShellHook}" echo "4. ${testForPiDisabled}" echo "5. ${testEmptyRulesMdSection}" echo "6. ${testRulesMdSection}" echo "All tests passed" touch $out ''