|
|
|
"""Tests for the diff module."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
import pathlib
|
|
|
|
import pytest
|
|
|
|
import typing as t
|
|
|
|
|
|
|
|
if t.TYPE_CHECKING: # pragma: nocover
|
|
|
|
# noinspection PyProtectedMember
|
|
|
|
from ansible_test._internal.diff import FileDiff
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture()
|
|
|
|
def diffs(request: pytest.FixtureRequest) -> list[FileDiff]:
|
|
|
|
"""A fixture which returns the parsed diff associated with the current test."""
|
|
|
|
return get_parsed_diff(request.node.name.removeprefix('test_'))
|
|
|
|
|
|
|
|
|
|
|
|
def get_parsed_diff(name: str) -> list[FileDiff]:
|
|
|
|
"""Parse and return the named git diff."""
|
|
|
|
cache = pathlib.Path(__file__).parent / 'diff' / f'{name}.diff'
|
|
|
|
content = cache.read_text()
|
|
|
|
lines = content.splitlines()
|
|
|
|
|
|
|
|
assert lines
|
|
|
|
|
|
|
|
# noinspection PyProtectedMember
|
|
|
|
from ansible_test._internal.diff import parse_diff
|
|
|
|
|
|
|
|
diffs = parse_diff(lines)
|
|
|
|
|
|
|
|
assert diffs
|
|
|
|
|
|
|
|
for item in diffs:
|
|
|
|
assert item.headers
|
|
|
|
assert item.is_complete
|
|
|
|
|
|
|
|
item.old.format_lines()
|
|
|
|
item.new.format_lines()
|
|
|
|
|
|
|
|
for line_range in item.old.ranges:
|
|
|
|
assert line_range[1] >= line_range[0] > 0
|
|
|
|
|
|
|
|
for line_range in item.new.ranges:
|
|
|
|
assert line_range[1] >= line_range[0] > 0
|
|
|
|
|
|
|
|
return diffs
|
|
|
|
|
|
|
|
|
|
|
|
def test_add_binary_file(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Add a binary file."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'binary.dat'
|
|
|
|
assert diffs[0].new.path == 'binary.dat'
|
|
|
|
|
|
|
|
assert diffs[0].old.eof_newline
|
|
|
|
assert diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_add_text_file(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Add a new file."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert not diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'test.txt'
|
|
|
|
assert diffs[0].new.path == 'test.txt'
|
|
|
|
|
|
|
|
assert diffs[0].old.eof_newline
|
|
|
|
assert diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_remove_trailing_newline(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Remove the trailing newline from a file."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'test.txt'
|
|
|
|
assert diffs[0].new.path == 'test.txt'
|
|
|
|
|
|
|
|
assert diffs[0].old.eof_newline
|
|
|
|
assert not diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_add_trailing_newline(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Add a trailing newline to a file."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'test.txt'
|
|
|
|
assert diffs[0].new.path == 'test.txt'
|
|
|
|
|
|
|
|
assert not diffs[0].old.eof_newline
|
|
|
|
assert diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_add_two_text_files(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Add two text files."""
|
|
|
|
assert len(diffs) == 2
|
|
|
|
|
|
|
|
assert not diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'one.txt'
|
|
|
|
assert diffs[0].new.path == 'one.txt'
|
|
|
|
|
|
|
|
assert diffs[0].old.eof_newline
|
|
|
|
assert diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
assert not diffs[1].old.exists
|
|
|
|
assert diffs[1].new.exists
|
|
|
|
|
|
|
|
assert diffs[1].old.path == 'two.txt'
|
|
|
|
assert diffs[1].new.path == 'two.txt'
|
|
|
|
|
|
|
|
assert diffs[1].old.eof_newline
|
|
|
|
assert diffs[1].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_context_no_trailing_newline(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Context without a trailing newline."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'test.txt'
|
|
|
|
assert diffs[0].new.path == 'test.txt'
|
|
|
|
|
|
|
|
assert not diffs[0].old.eof_newline
|
|
|
|
assert not diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_multiple_context_lines(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Multiple context lines."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'test.txt'
|
|
|
|
assert diffs[0].new.path == 'test.txt'
|
|
|
|
|
|
|
|
assert diffs[0].old.eof_newline
|
|
|
|
assert diffs[0].new.eof_newline
|
|
|
|
|
|
|
|
|
|
|
|
def test_parse_delete(diffs: list[FileDiff]) -> None:
|
|
|
|
"""Delete files."""
|
|
|
|
assert len(diffs) == 1
|
|
|
|
|
|
|
|
assert diffs[0].old.exists
|
|
|
|
assert not diffs[0].new.exists
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'changelogs/fragments/79263-runme-sh-logging-3cb482385bd59058.yaml'
|
|
|
|
assert diffs[0].new.path == 'changelogs/fragments/79263-runme-sh-logging-3cb482385bd59058.yaml'
|
|
|
|
|
|
|
|
|
|
|
|
def test_parse_rename(diffs) -> None:
|
|
|
|
"""Rename files."""
|
|
|
|
assert len(diffs) == 2
|
|
|
|
|
|
|
|
assert all(item.old.path != item.new.path and item.old.exists and item.new.exists for item in diffs)
|
|
|
|
|
|
|
|
assert diffs[0].old.path == 'packaging/debian/ansible-base.dirs'
|
|
|
|
assert diffs[0].new.path == 'packaging/debian/ansible-core.dirs'
|
|
|
|
|
|
|
|
assert diffs[1].old.path == 'packaging/debian/ansible-base.install'
|
|
|
|
assert diffs[1].new.path == 'packaging/debian/ansible-core.install'
|