Skip to content

Commit 4c13435

Browse files
committed
Add failing tests for issue #22 and #25: relative constraints path
Tests demonstrate that constraints path in requirements-out should be relative to the requirements file's directory, not from the config file location.
1 parent 300c3b0 commit 4c13435

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed

tests/test_processing.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import pathlib
23
import pytest
34
from io import StringIO
@@ -407,3 +408,114 @@ def test_write_no_constraints(tmp_path):
407408
assert not const_file.exists()
408409
finally:
409410
os.chdir(old_cwd)
411+
412+
413+
def test_relative_constraints_path_in_subdirectory(tmp_path):
414+
"""Test that constraints path in requirements-out is relative to requirements file location.
415+
416+
This reproduces issue #22: when requirements-out and constraints-out are in subdirectories,
417+
the constraints reference should be relative to the requirements file's directory.
418+
"""
419+
from mxdev.processing import read, write
420+
from mxdev.state import State
421+
from mxdev.config import Configuration
422+
423+
old_cwd = os.getcwd()
424+
try:
425+
os.chdir(tmp_path)
426+
427+
# Create subdirectory for output files
428+
(tmp_path / "requirements").mkdir()
429+
430+
# Create input constraints file
431+
constraints_in = tmp_path / "constraints.txt"
432+
constraints_in.write_text("requests==2.28.0\nurllib3==1.26.9\n")
433+
434+
# Create input requirements file with a constraint reference
435+
requirements_in = tmp_path / "requirements.txt"
436+
requirements_in.write_text("-c constraints.txt\nrequests\n")
437+
438+
# Create config with both output files in subdirectory
439+
config_file = tmp_path / "mx.ini"
440+
config_file.write_text(
441+
"""[settings]
442+
requirements-in = requirements.txt
443+
requirements-out = requirements/plone.txt
444+
constraints-out = requirements/constraints.txt
445+
"""
446+
)
447+
448+
config = Configuration(str(config_file))
449+
state = State(configuration=config)
450+
451+
# Read and write
452+
read(state)
453+
write(state)
454+
455+
# Check requirements file contains relative path to constraints
456+
req_file = tmp_path / "requirements" / "plone.txt"
457+
assert req_file.exists()
458+
req_content = req_file.read_text()
459+
460+
# Bug: Currently writes "-c requirements/constraints.txt"
461+
# Expected: Should write "-c constraints.txt" (relative to requirements file's directory)
462+
assert "-c constraints.txt\n" in req_content, (
463+
f"Expected '-c constraints.txt' (relative path), "
464+
f"but got:\n{req_content}"
465+
)
466+
467+
# Should NOT contain the full path from config file's perspective
468+
assert "-c requirements/constraints.txt" not in req_content
469+
finally:
470+
os.chdir(old_cwd)
471+
472+
473+
def test_relative_constraints_path_different_directories(tmp_path):
474+
"""Test constraints path when requirements and constraints are in different directories."""
475+
from mxdev.processing import read, write
476+
from mxdev.state import State
477+
from mxdev.config import Configuration
478+
479+
old_cwd = os.getcwd()
480+
try:
481+
os.chdir(tmp_path)
482+
483+
# Create different subdirectories
484+
(tmp_path / "reqs").mkdir()
485+
(tmp_path / "constraints").mkdir()
486+
487+
# Create input constraints file
488+
constraints_in = tmp_path / "constraints.txt"
489+
constraints_in.write_text("requests==2.28.0\nurllib3==1.26.9\n")
490+
491+
# Create input requirements file with a constraint reference
492+
requirements_in = tmp_path / "requirements.txt"
493+
requirements_in.write_text("-c constraints.txt\nrequests\n")
494+
495+
config_file = tmp_path / "mx.ini"
496+
config_file.write_text(
497+
"""[settings]
498+
requirements-in = requirements.txt
499+
requirements-out = reqs/requirements.txt
500+
constraints-out = constraints/constraints.txt
501+
"""
502+
)
503+
504+
config = Configuration(str(config_file))
505+
state = State(configuration=config)
506+
507+
read(state)
508+
write(state)
509+
510+
req_file = tmp_path / "reqs" / "requirements.txt"
511+
assert req_file.exists()
512+
req_content = req_file.read_text()
513+
514+
# Should write path relative to reqs/ directory
515+
# From reqs/ to constraints/constraints.txt = ../constraints/constraints.txt
516+
assert "-c ../constraints/constraints.txt\n" in req_content, (
517+
f"Expected '-c ../constraints/constraints.txt' (relative path), "
518+
f"but got:\n{req_content}"
519+
)
520+
finally:
521+
os.chdir(old_cwd)

0 commit comments

Comments
 (0)