Skip to content

Commit

Permalink
chore(api/tests): added test for repo cloning
Browse files Browse the repository at this point in the history
  • Loading branch information
c0rydoras committed Oct 31, 2023
1 parent db07750 commit 289bb17
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 2 deletions.
12 changes: 12 additions & 0 deletions api/outdated/conftest.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from __future__ import annotations

from functools import partial
from pathlib import Path
from shutil import rmtree
from typing import TYPE_CHECKING

import pytest
Expand Down Expand Up @@ -94,3 +96,13 @@ def _tracker_mock(target: str) -> MagicMock:
def tracker_init_mock(mocker: MockerFixture) -> MagicMock:
"""Mock for the Trackers __init__ method."""
return mocker.patch.object(Tracker, "__init__", return_value=None)


@pytest.fixture
def repo_root(settings) -> Path: # noqa: ANN001
"""Change location of cloned projects to /tmp/outdated/projects/ ."""
settings.REPOSITORY_ROOT = _root = "/tmp/outdated/projects" # noqa: S108
root = Path(_root)
root.mkdir(parents=True, exist_ok=False)
yield root
rmtree(root)
43 changes: 43 additions & 0 deletions api/outdated/outdated/tests/test_tracking.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
from unittest.mock import ANY, MagicMock

from django.urls import reverse
from rest_framework import status

from outdated.outdated.models import Project
from outdated.outdated.parser import LockfileParser
from outdated.outdated.tracking import Tracker


def test_serializer(client, project_factory, tracker_init_mock, tracker_mock):
Expand Down Expand Up @@ -62,3 +66,42 @@ def test_serializer(client, project_factory, tracker_init_mock, tracker_mock):
assert resp.status_code == status.HTTP_204_NO_CONTENT

assert delete_mock.call_count == 2


def test_clone(db, project_factory, settings, mocker, repo_root):
settings.TRACKED_DEPENDENCIES = ["is-odd", "requests"]
assert list(repo_root.iterdir()) == []
project: Project = project_factory(repo="github.com/c0rydoras/lockfile-test")
tracker = Tracker(project)
tracker.clone()
path = tracker.repository_path
assert path != repo_root.absolute()
assert list(path.iterdir()) == [path / ".git"]
tracker.checkout()

js = path / "js"
python = path / "python"
assert list(path.iterdir()) == [path / ".git", js, python]

assert (poetry_lock := python.joinpath("poetry.lock")).exists()
assert (yarn_lock := js.joinpath("yarn.lock")).exists()

lockfiles = tracker.lockfiles

assert poetry_lock in lockfiles
assert yarn_lock in lockfiles
assert len(lockfiles) == 2

lockfile_parser_mock: MagicMock = mocker.spy(LockfileParser, "__init__")

tracker.sync()

lockfile_parser_mock.assert_called_once_with(ANY, lockfiles)

dependencies = [
version.release_version.dependency.name
for version in project.versioned_dependencies.all()
]

assert "is-odd" in dependencies
assert "requests" in dependencies
8 changes: 6 additions & 2 deletions api/outdated/outdated/tracking.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class RepoError(ValueError):
class Tracker:
def __init__(self, project: Project) -> None:
self.project = project
self.local_path = Path(f"/projects/{self.project.clone_path}")
self.local_path = Path(f"{settings.REPOSITORY_ROOT}/{self.project.clone_path}")

def _run(
self,
Expand Down Expand Up @@ -82,7 +82,11 @@ def lockfiles(self):

@property
def repository_path(self):
return self.local_path.absolute() if self.local_path.exists() else "/projects/"
return (
self.local_path.absolute()
if self.local_path.exists()
else Path(settings.REPOSITORY_ROOT)
)

def sync(self):
if not self.local_path.exists():
Expand Down
2 changes: 2 additions & 0 deletions api/outdated/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,8 @@ def default(default_dev=env.NOTSET, default_prod=env.NOTSET):
],
)

# Where to put the cloned projects
REPOSITORY_ROOT = "/projects"

NPM_FILES = ["yarn.lock", "pnpm-lock.yaml"]
PYPI_FILES = ["poetry.lock"]
Expand Down

0 comments on commit 289bb17

Please sign in to comment.