wrolpi/modules/repos/test/test_config.py
Roland 03e3476631
repos: history, Download ZIP, and submodules
* GET /api/repos/<id>/log: the checked out branch's commits, newest
  first, a page at a time, with the total.  The repo page has a
  Files | History toggle (the tree is only listed for Files).
* GET /api/repos/<id>/archive.zip: `git archive HEAD` streamed to the
  browser; the file name is reduced to safe characters.  Everything is
  read from the database before the response starts, because the
  request's session closes once a streamed response begins.
* repository.submodules (default off): submodules are checked out with
  the repo's mode and the same git restrictions, and removed when the
  option is turned off.  A submodule that cannot be downloaded (e.g. an
  ssh URL) does not stop the repo from updating; the download is
  retried with the submodule's error.
* The README speed test bound is loose enough for a busy machine.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-06 16:56:09 -06:00

88 lines
3.9 KiB
Python

import pytest
from modules.repos import lib
from modules.repos.models import Repository
from wrolpi.collections.models import Collection
from wrolpi.downloader import Download, DownloadFrequency
@pytest.mark.asyncio
async def test_dump_and_import(test_session, test_directory, async_client, test_wrolpi_config, await_switches):
"""repos.yaml is the source of truth; a lost database is rebuilt from it."""
lib.create_repository(test_session, 'https://github.com/kiwix/kiwix-tools', tag_name='software',
description='Tools', frequency=DownloadFrequency.daily)
lib.create_repository(test_session, 'https://github.com/a/b', mode='snapshot', branch='dev')
await await_switches()
config = lib.get_repos_config()
assert config.get_file().is_file()
assert config.repos == [
dict(name='b', url='https://github.com/a/b', directory='repos/b', tag_name=None, description=None,
mode='snapshot', branch='dev', submodules=False, frequency=DownloadFrequency.weekly),
dict(name='kiwix-tools', url='https://github.com/kiwix/kiwix-tools', directory='repos/software/kiwix-tools',
tag_name='software', description='Tools', mode='full', branch=None, submodules=False,
frequency=DownloadFrequency.daily),
]
# Lose the database.
for repo in test_session.query(Repository).all():
lib._delete_repository(test_session, repo)
test_session.commit()
assert test_session.query(Collection).count() == 0
config.import_config()
test_session.expire_all()
repos = {i.name: i for i in test_session.query(Repository)}
assert repos['kiwix-tools'].directory == test_directory / 'repos/software/kiwix-tools'
assert repos['kiwix-tools'].tag_name == 'software'
assert repos['kiwix-tools'].collection.description == 'Tools'
assert repos['kiwix-tools'].download.frequency == DownloadFrequency.daily
assert (repos['b'].mode, repos['b'].branch) == ('snapshot', 'dev')
assert {i.downloader for i in test_session.query(Download)} == {'git'}
# A repo removed from the config is deleted.
data = config.read_config_file()
data['repos'] = data['repos'][1:]
data['version'] += 1
config.write_config_data(data, config.get_file())
config.import_config()
test_session.expire_all()
assert [i.name for i in test_session.query(Repository)] == ['kiwix-tools']
assert test_session.query(Download).count() == 1
@pytest.mark.asyncio
async def test_import_links_existing_download(test_session, async_client, test_wrolpi_config):
"""A Repo imported after download_manager.yaml re-uses its Download."""
lib.create_repository(test_session, 'https://github.com/a/b')
test_session.query(Repository).delete()
test_session.query(Collection).delete()
test_session.commit()
download = test_session.query(Download).one()
assert download.collection_id is None
config = lib.get_repos_config()
config.write_config_data(dict(version=1, repos=[dict(name='b', url='https://github.com/a/b', frequency=3600)]),
config.get_file())
config.import_config()
test_session.expire_all()
repo = test_session.query(Repository).one()
assert test_session.query(Download).one().id == download.id
assert download.collection_id == repo.collection_id
assert download.frequency == 3600
@pytest.mark.asyncio
async def test_delete_last_repo(test_session, async_client, test_wrolpi_config, await_switches):
"""Deleting the last Repo empties the config, so it does not return on the next import."""
repo = lib.create_repository(test_session, 'https://github.com/a/b')
await await_switches()
config = lib.get_repos_config()
assert len(config.read_config_file()['repos']) == 1
request, response = await async_client.delete(f'/api/repos/{repo.id}')
assert config.read_config_file()['repos'] == []
config.import_config()
assert test_session.query(Repository).count() == 0