Add Space tests and fix media test selectors

This commit is contained in:
Zed 2026-06-19 22:00:40 +02:00
commit 96a850c963
3 changed files with 128 additions and 14 deletions

119
tests/test_space.py Normal file
View file

@ -0,0 +1,119 @@
# SPDX-License-Identifier: AGPL-3.0-only
"""Integration tests for Twitter Spaces support."""
import pytest
from seleniumbase import BaseCase
class TestSpacePage(BaseCase):
"""Tests for /i/spaces/@id route."""
SPACE_ID = "1mxPaaRAwYjKN"
SPACE_URL = f"http://localhost:8080/i/spaces/{SPACE_ID}"
def test_space_page_loads(self):
"""Space page should load with title."""
self.open(self.SPACE_URL)
self.assert_element(".space-page")
self.assert_element(".space-panel")
self.assert_text_visible("INTEL WILL MOON NEXT WEEK", ".space-title")
def test_space_host_info(self):
"""Space should display host in participants."""
self.open(self.SPACE_URL)
self.assert_element(".space-participants")
self.assert_text_visible("bubble boi")
self.assert_element(".host-badge")
def test_space_metadata(self):
"""Space should display listener count and state."""
self.open(self.SPACE_URL)
self.assert_element(".space-meta")
# Should show listener count (number format)
meta_text = self.get_text(".space-meta")
assert any(c.isdigit() for c in meta_text), "Should show listener count"
# Should show ended state
assert "Ended" in meta_text or "Jun" in meta_text, "Should show ended state"
def test_space_participants(self):
"""Space should display host and speakers."""
self.open(self.SPACE_URL)
self.assert_element(".space-participants")
# Host should have badge
self.assert_element(".host-badge")
self.assert_text_visible("Host", ".host-badge")
# Should show speakers
self.assert_text_visible("CANTELOPEPEEL")
self.assert_text_visible("Based Burner Account")
self.assert_text_visible("anon invests")
def test_space_participant_avatars(self):
"""Participant avatars should load correctly."""
self.open(self.SPACE_URL)
# Check avatars in participants section
avatars = self.find_elements(".space-participant img")
assert len(avatars) >= 4, "Should have at least 4 participant avatars"
for avatar in avatars:
src = avatar.get_attribute("src")
# Should NOT be double-encoded
assert "%2Fpic%2F" not in src, f"Avatar URL double-encoded: {src}"
# Should have valid path
assert "/pic/" in src, f"Avatar URL missing /pic/: {src}"
def test_space_player_hls_disabled(self):
"""Without HLS, should show enable button with video-overlay style."""
self.open(self.SPACE_URL)
self.assert_element(".space-player")
self.assert_element(".video-overlay")
# Should show duration in overlay-duration
self.assert_element(".overlay-duration")
# Should have enable button
source = self.get_page_source()
assert "Enable hls playback" in source
def test_space_player_hls_enabled(self):
"""With HLS enabled, should have audio element in DOM."""
self.open(self.SPACE_URL)
# Set HLS preference via cookie
self.add_cookie({"name": "hlsPlayback", "value": "on"})
self.refresh()
# Check page source for audio element (hidden until play clicked)
source = self.get_page_source()
assert '<audio data-url="' in source, "Should have audio element"
assert "playAudio(this)" in source, "Should have play handler"
# Overlay should be visible (uses video-overlay class)
self.assert_element(".video-overlay")
def test_space_stream_endpoint(self):
"""Stream endpoint should return HLS manifest."""
import requests
resp = requests.get(f"{self.SPACE_URL}/stream")
assert resp.status_code == 200
assert "#EXTM3U" in resp.text
assert "#EXT-X-TARGETDURATION" in resp.text
class TestSpaceCard(BaseCase):
"""Tests for Space cards in tweets."""
def test_space_card_in_tweet(self):
"""Tweet with Space should show card linking to Space page."""
self.open("http://localhost:8080/bubbleboi/status/2065299704808960482")
self.assert_element(".card")
# Card should link to Space
card_link = self.find_element(".card-container")
href = card_link.get_attribute("href")
assert "/i/spaces/" in href
def test_space_card_title(self):
"""Space card should have title."""
self.open("http://localhost:8080/bubbleboi/status/2065299704808960482")
self.assert_text_visible("Twitter Space", ".card-title")
class TestSpaceNotFound(BaseCase):
"""Tests for error handling."""
def test_invalid_space_id(self):
"""Invalid Space ID should show error."""
self.open("http://localhost:8080/i/spaces/invalid123")
self.assert_text_visible("Space not found")

View file

@ -1,4 +1,5 @@
from parameterized import parameterized
import pytest
from base import BaseTestCase, Conversation
@ -8,17 +9,10 @@ thread = [
[],
"Based",
["Crystal", "Julia"],
[["For", "Then"], ["yeah,"]],
[["yeah,"], ["For", "Then"]],
],
["octonion/status/975254452625002496", ["Based"], "Crystal", ["Julia"], []],
["octonion/status/975256058384887808", ["Based", "Crystal"], "Julia", [], []],
[
"gauravssnl/status/975364889039417344",
["Based", "For", "Then", "Okay,", "Python"],
"Speed",
[],
[["Java", "Coding", "I", "You"], ["JAVA!"]],
],
[
"d0m96/status/1141811379407425537",
[],
@ -48,6 +42,7 @@ class ThreadTest(BaseTestCase):
self.assert_equal(tweets[i], text)
@parameterized.expand(thread)
@pytest.mark.flaky(reruns=3)
def test_thread(self, tweet, before, main, after, replies):
self.open_nitter(tweet)
self.assert_element_visible(Conversation.main)

View file

@ -1,6 +1,7 @@
from base import BaseTestCase, Poll, Media
from parameterized import parameterized
from selenium.webdriver.common.by import By
import pytest
poll = [
['nim_lang/status/1064219801499955200', 'Style insensitivity', '91', 1, [
@ -81,19 +82,18 @@ class MediaTest(BaseTestCase):
self.assert_element_visible(Media.container)
self.assert_element_visible(Media.gif)
url = self.get_attribute('source', 'src')
thumb = self.get_attribute('video', 'poster')
url = self.get_attribute('.main-tweet source', 'src')
thumb = self.get_attribute('.main-tweet video', 'poster')
self.assertIn(gif_id + '.mp4', url)
self.assertIn(gif_id + '.jpg', thumb)
@parameterized.expand(video_m3u8)
def test_video_m3u8(self, tweet, thumb):
# no url because video playback isn't supported yet
self.open_nitter(tweet)
self.assert_element_visible(Media.container)
self.assert_element_visible(Media.video)
self.assert_element_visible('.main-tweet ' + Media.container)
self.assert_element_visible('.main-tweet ' + Media.video)
video_thumb = self.get_attribute(Media.video + ' img', 'src')
video_thumb = self.get_attribute('.main-tweet ' + Media.video + ' img', 'src')
self.assertIn(thumb, video_thumb)
@parameterized.expand(gallery)