|
- import pytest
- from pathlib import Path
- from typing import Tuple
- import subprocess
- import platform
-
- from dds_ci import proc
- from dds_ci.dds import DDSWrapper
- from dds_ci.testing import ProjectOpener, Project, error
-
-
- @pytest.fixture()
- def test_project(project_opener: ProjectOpener) -> Project:
- return project_opener.open('projects/simple')
-
-
- def test_create_pkg(test_project: Project, tmp_path: Path) -> None:
- # Create in the default location
- test_project.pkg_create()
- sd_dir = test_project.build_root / 'foo@1.2.3.tar.gz'
- assert sd_dir.is_file(), 'Did not create an sdist in the default location'
- # Create in a different location
- dest = tmp_path / 'dummy.tar.gz'
- test_project.pkg_create(dest=dest)
- assert dest.is_file(), 'Did not create an sdist in the new location'
-
-
- @pytest.fixture()
- def _test_pkg(test_project: Project) -> Tuple[Path, Project]:
- repo_content_path = test_project.dds.repo_dir / 'foo@1.2.3'
- assert not repo_content_path.is_dir()
- test_project.pkg_create()
- assert not repo_content_path.is_dir()
- return test_project.build_root / 'foo@1.2.3.tar.gz', test_project
-
-
- def test_import_sdist_archive(_test_pkg: Tuple[Path, Project]) -> None:
- sdist, project = _test_pkg
- repo_content_path = project.dds.repo_dir / 'foo@1.2.3'
- project.dds.pkg_import(sdist)
- assert repo_content_path.is_dir(), \
- 'The package did not appear in the local cache'
- assert repo_content_path.joinpath('library.jsonc').is_file(), \
- 'The package\'s library.jsonc did not get imported'
- # Excluded file will not be in the sdist:
- assert not repo_content_path.joinpath('other-file.txt').is_file(), \
- 'Non-package content appeared in the package cache'
-
-
- @pytest.mark.skipif(platform.system() == 'Windows',
- reason='Windows has trouble reading packages from stdin. Need to investigate.')
- def test_import_sdist_stdin(_test_pkg: Tuple[Path, Project]) -> None:
- sdist, project = _test_pkg
- pipe = subprocess.Popen(
- list(proc.flatten_cmd([
- project.dds.path,
- project.dds.cache_dir_arg,
- 'pkg',
- 'import',
- '--stdin',
- ])),
- stdin=subprocess.PIPE,
- )
- assert pipe.stdin
- with sdist.open('rb') as sdist_bin:
- buf = sdist_bin.read(1024)
- while buf:
- pipe.stdin.write(buf)
- buf = sdist_bin.read(1024)
- pipe.stdin.close()
-
- rc = pipe.wait()
- assert rc == 0, 'Subprocess failed'
- _check_import(project.dds.repo_dir / 'foo@1.2.3')
-
-
- def test_import_sdist_dir(test_project: Project) -> None:
- test_project.dds.run(['pkg', 'import', test_project.dds.cache_dir_arg, test_project.root])
- _check_import(test_project.dds.repo_dir / 'foo@1.2.3')
-
-
- def _check_import(repo_content_path: Path) -> None:
- assert repo_content_path.is_dir(), \
- 'The package did not appear in the local cache'
- assert repo_content_path.joinpath('library.jsonc').is_file(), \
- 'The package\'s library.jsonc did not get imported'
- # Excluded file will not be in the sdist:
- assert not repo_content_path.joinpath('other-file.txt').is_file(), \
- 'Non-package content appeared in the package cache'
-
-
- def test_sdist_invalid_project(tmp_project: Project) -> None:
- with error.expect_error_marker('no-package-json5'):
- tmp_project.pkg_create()
-
-
- @pytest.mark.skipif(platform.system() != 'Linux', reason='We know this fails on Linux')
- def test_sdist_unreadable_dir(dds: DDSWrapper) -> None:
- with error.expect_error_marker('failed-package-json5-scan'):
- dds.run(['pkg', 'create', '--project=/root'])
-
-
- def test_sdist_invalid_json5(tmp_project: Project) -> None:
- tmp_project.write('package.json5', 'bogus json5')
- with error.expect_error_marker('package-json5-parse-error'):
- tmp_project.pkg_create()
|