from typing import Optional
import textwrap
from repo_autoindex import autoindex
from repo_autoindex._impl.base import GeneratedIndex
REPOMD_XML = textwrap.dedent(
"""
1657165688d4888f04f95ac067af4d997d35c6d345cbe398563d777d017a3634c9ed6148cf6fc4eddd4e9de89246efba3815b8a9dec9dfe168e4fd3104cc792dff908a0f621657165688293216585284769ec79daa9e0a3b0129bb6260cc6271c90c4fe02b43dfa7cdf7635fb803f72f89223c8b0f6c7a2ee6ed7fbd16ee0bb395ca68260038bb3895265af84c29f165716568846213691136c2195bbee0c39ee080969abc6fd59d943c3471114cfd43c6e776ac20d7ed2139f52cf295db14e863abcd7b2eede8e6c5e39ac9b2f194349459d29cd492c90f16571656881408843255e6bfd00e889c5c1f9a3c9fb35a660158bc5d975ae082d434f3cf81cc2c0c21b2692c49d1d98d68e764e29108d8a81a3dfd9e04fa7665115853a029396d118d1657165688760911468810de63a509812c37f7736fcef0b79e9c55dfe67a2d77006f74fdc442935103e9e640eb5d53fe547c98d470813256c9bfc8a239b13697d8eb824a1485c9e186a0e316571656881032365536109aa39b62df200cb3784dea24092d0c1c686afff0cd0990c2ec7a61afe8896e1c3e5cefb10ce805b827e12ca3b4839bba873dc9403fd92b60a364bf6f312bd972165716568827583276810
"""
).strip()
PRIMARY_XML = textwrap.dedent(
"""
wireplumberx86_64539a773f3f39a7b2b5f971bdd0063f7d4201aab00920f380962e935356dc4d3aA modular session/policy manager for PipeWireWirePlumber is a modular session/policy manager for PipeWire and a
GObject-based high-level library that wraps PipeWire's API, providing
convenience for writing the daemon's modules as well as external tools for
managing PipeWire.Fedora Projecthttps://pipewire.pages.freedesktop.org/wireplumber/MITFedora ProjectUnspecifiedbuildvm-x86-27.iad2.fedoraproject.orgwireplumber-0.4.10-1.fc36.src.rpm/etc/wireplumber/etc/wireplumber/bluetooth.lua.d/etc/wireplumber/common/etc/wireplumber/main.lua.d/etc/wireplumber/policy.lua.d/usr/bin/wireplumber/usr/bin/wpctl/usr/bin/wpexecwireplumber-libsx86_641f0d373bd1b8af6b4b7baab1c89e4820aa8cd8691f51fca4fccac9785fe715eaLibraries for WirePlumber clientsThis package contains the runtime libraries for any application that wishes
to interface with WirePlumber.Fedora Projecthttps://pipewire.pages.freedesktop.org/wireplumber/MITFedora ProjectUnspecifiedbuildvm-x86-27.iad2.fedoraproject.orgwireplumber-0.4.10-1.fc36.src.rpmxfce4-panelx86_641eecad127499d557f9d97562a1c65d9c881f3f63431546007a9ed714997b909cNext generation panel for XfceThis package includes the panel for the Xfce desktop environment.Fedora Projecthttp://www.xfce.org/GPLv2+ and LGPLv2+Fedora ProjectUnspecifiedbuildvm-x86-16.iad2.fedoraproject.orgxfce4-panel-4.16.4-1.fc36.src.rpm/etc/xdg/xfce4/panel/default.xml/usr/bin/xfce4-panel/usr/bin/xfce4-popup-applicationsmenu/usr/bin/xfce4-popup-directorymenu/usr/bin/xfce4-popup-windowmenuxfce4-power-managerx86_6448697b6e83646e702d83523acd4a25df546129a1a11f3fbb81724c30d58e9c21Power management for the Xfce desktop environmentXfce Power Manager uses the information and facilities provided by HAL to
display icons and handle user callbacks in an interactive Xfce session.
Xfce Power Preferences allows authorised users to set policy and change
preferences.Fedora Projecthttp://goodies.xfce.org/projects/applications/xfce4-power-managerGPLv2+Fedora ProjectUnspecifiedbuildvm-x86-21.iad2.fedoraproject.orgxfce4-power-manager-4.16.0-5.fc36.src.rpm/etc/xdg/autostart/xfce4-power-manager.desktop/etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xfce4-power-manager.xml/usr/bin/xfce4-power-manager/usr/bin/xfce4-power-manager-settings/usr/sbin/xfce4-pm-helper/usr/sbin/xfpm-power-backlight-helperxfce4-terminalx86_646b6d0d941c16988b4c68ae473f1af141dedafe691922c0c88f6f3ef82baeef79Terminal Emulator for the Xfce Desktop environmentXfce4-terminal is a lightweight and easy to use terminal emulator application
with many advanced features including drop down, tabs, unlimited scrolling,
full colors, fonts, transparent backgrounds, and more.Fedora Projecthttp://docs.xfce.org/apps/terminal/startGPLv2+Fedora ProjectUnspecifiedbuildvm-x86-15.iad2.fedoraproject.orgxfce4-terminal-1.0.3-1.fc36.src.rpm/usr/bin/xfce4-terminal
"""
).strip()
class StaticFetcher:
def __init__(self):
self.content: dict[str, str] = {}
async def __call__(self, url: str) -> Optional[str]:
return self.content.get(url)
async def test_typical_index():
fetcher = StaticFetcher()
fetcher.content["https://example.com/repodata/repomd.xml"] = REPOMD_XML
fetcher.content[
"https://example.com/repodata/d4888f04f95ac067af4d997d35c6d345cbe398563d777d017a3634c9ed6148cf-primary.xml.gz"
] = PRIMARY_XML
entries: list[GeneratedIndex] = []
async for entry in autoindex("https://example.com", fetcher=fetcher):
entries.append(entry)
# It should generate some entries
assert entries
entries.sort(key=lambda e: e.relative_dir)
# First check that the directory structure was reproduced.
assert [e.relative_dir for e in entries] == [
"",
"packages",
"packages/w",
"packages/x",
"repodata",
]
by_relative_dir: dict[str, GeneratedIndex] = {}
for entry in entries:
by_relative_dir[entry.relative_dir] = entry
# Sanity check a few links expected to appear in each.
assert '' in by_relative_dir[""].content
assert '' in by_relative_dir[""].content
assert '' in by_relative_dir["packages"].content
assert '' in by_relative_dir["packages"].content
assert (
''
in by_relative_dir["repodata"].content
)
assert (
''
in by_relative_dir["packages/w"].content
)
assert (
''
in by_relative_dir["packages/x"].content
)