Skip to content

Commit

Permalink
tests: create integration tests for talking to snapd
Browse files Browse the repository at this point in the history
  • Loading branch information
lengau committed Sep 24, 2024
1 parent c1e4128 commit 11985c8
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 1 deletion.
3 changes: 2 additions & 1 deletion craft_parts/packages/snaps.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import contextlib
import logging
import os
import pathlib
import subprocess
import sys
from typing import (
Expand Down Expand Up @@ -274,7 +275,7 @@ def refresh(self) -> None:
self._is_installed = None


def download_snaps(*, snaps_list: Sequence[str], directory: str) -> None:
def download_snaps(*, snaps_list: Sequence[str], directory: str | pathlib.Path) -> None:
"""Download snaps of the format <snap-name>/<channel> into directory.
The target directory is created if it does not exist.
Expand Down
6 changes: 6 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ def new_dir(monkeypatch, tmpdir):
yield tmpdir


@pytest.fixture
def new_path(monkeypatch, tmp_path):
monkeypatch.chdir(tmp_path)
return tmp_path


@pytest.fixture
def mock_chdir(monkeypatch):
mock_fn = mock.Mock(spec=os.chdir)
Expand Down
57 changes: 57 additions & 0 deletions tests/integration/packages/test_snaps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
#
# Copyright 2024 Canonical Ltd.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License version 3 as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""Integration tests for interacting with snapd."""

import pathlib
from collections.abc import Sequence

import pytest
import pytest_check # type: ignore[import]
from craft_parts.packages import snaps


def test_get_installed_snaps_success():
"""Test that get_installed_snaps returns a list of snaps."""
actual = snaps.get_installed_snaps()

for snap in actual:
name, _, revision = snap.partition("=")
pytest_check.is_true(len(name) >= 1)
if revision.startswith("x"):
# Locally installed snaps should be of the form "x<int>"
with pytest_check.check():
int(revision[1:])
else:
# Store-instaled snaps should simply have an integer revision.
with pytest_check.check():
int(revision)


@pytest.mark.parametrize(
"snaps_list",
[
{"snapcraft", "ruff"},
{"snapcraft/7.x/stable"},
],
)
def test_download_snaps_success(new_path: pathlib.Path, snaps_list: Sequence[str]):

snaps.download_snaps(snaps_list=snaps_list, directory=new_path)

for snap in snaps_list:
snap_name, _, snap_channel = snap.partition("/")
assert len(list(new_path.glob(f"{snap_name}*.snap"))) == 1
assert len(list(new_path.glob(f"{snap_name}*.assert"))) == 1

0 comments on commit 11985c8

Please sign in to comment.