Skip to content
This repository was archived by the owner on Aug 29, 2026. It is now read-only.

Commit 92a713a

Browse files
committed
chore: Add E2E tests for pdf viewer
1 parent afcb2ea commit 92a713a

4 files changed

Lines changed: 119 additions & 2 deletions

File tree

.github/workflows/tests.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ jobs:
8181
npm ci --ignore-scripts
8282
npm run build
8383
npx --yes @tailwindcss/cli -i pdfding/static/css/input.css -o pdfding/static/css/tailwind.css --minify
84+
- name: Install pdf.js
85+
run: |
86+
sudo apt-get update
87+
sudo apt-get install curl unzip -y
88+
npm run build:pdfjs
8489
- name: Run tests
8590
run: poetry run python -m pytest pdfding/e2e
8691

pdfding/e2e/test_pdf_viewer_e2e.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
from time import sleep
2+
3+
from django.urls import reverse
4+
from helpers import PdfDingE2ETestCase
5+
from pdf.models.pdf_models import Pdf
6+
from pdf.services.pdf_services import PdfProcessingServices, get_or_create_pdf_reading_info
7+
from playwright.sync_api import expect, sync_playwright
8+
from users.service import get_demo_pdf
9+
10+
11+
class TestPdfViewerE2ETestCase(PdfDingE2ETestCase):
12+
def setUp(self, login: bool = True) -> None:
13+
super().setUp()
14+
self.pdf = Pdf.objects.create(
15+
name='some_pdf', collection=self.user.profile.current_collection, file=get_demo_pdf()
16+
)
17+
18+
def test_saving_page(self):
19+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
20+
21+
assert reading_info.current_page == 1
22+
23+
with sync_playwright() as p:
24+
self.open(reverse('view_pdf', kwargs={'identifier': self.pdf.id}), p)
25+
sleep(0.5) # we need to wait a bit for the PDF to be loaded
26+
27+
self.page.locator("#pageNumber").click()
28+
self.page.locator("#pageNumber").press("Delete")
29+
self.page.locator("#pageNumber").press("3")
30+
self.page.locator("#pageNumber").press("Enter")
31+
32+
# we need to sleep a bit, so the current page is updated
33+
sleep(3)
34+
35+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
36+
assert reading_info.current_page == 3
37+
38+
def test_change_zoom(self):
39+
with sync_playwright() as p:
40+
self.open(reverse('view_pdf', kwargs={'identifier': self.pdf.id}), p)
41+
42+
expect(self.page.locator("#scaleSelect")).to_have_value("auto")
43+
self.page.locator("#scaleSelect").click()
44+
self.page.locator("#scaleSelect").select_option("Page Fit")
45+
expect(self.page.locator("#scaleSelect")).to_have_value("page-fit")
46+
47+
def test_search(self):
48+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
49+
50+
assert reading_info.current_page == 1
51+
52+
with sync_playwright() as p:
53+
self.open(reverse('view_pdf', kwargs={'identifier': self.pdf.id}), p)
54+
sleep(0.5) # we need to wait a bit for the PDF to be loaded
55+
56+
self.page.locator("#viewFindButton").click()
57+
self.page.locator("#findInput").fill("Dictumst vel parturient nascetur etiam habitasse")
58+
self.page.locator("#findInput").press("Enter")
59+
60+
# we need to sleep a bit, so the current page is updated
61+
sleep(3)
62+
63+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
64+
assert reading_info.current_page == 2
65+
66+
def test_left_sidebar_pages(self):
67+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
68+
69+
assert reading_info.current_page == 1
70+
71+
with sync_playwright() as p:
72+
self.open(reverse('view_pdf', kwargs={'identifier': self.pdf.id}), p)
73+
sleep(0.5) # we need to wait a bit for the PDF to be loaded
74+
75+
self.page.locator("#viewsManagerToggleButton").click()
76+
# without <2068> not working
77+
self.page.get_by_role("button", name="Thumbnail of Page ⁨2⁩").click()
78+
79+
# we need to sleep a bit, so the current page is updated
80+
sleep(3)
81+
82+
reading_info = get_or_create_pdf_reading_info(self.pdf, self.user.profile)
83+
assert reading_info.current_page == 2
84+
85+
def test_save_pdf(self):
86+
# we use create_pdf as we wont the comments to processed
87+
pdf = PdfProcessingServices.create_pdf(
88+
"some_pdf", collection=self.user.profile.current_collection, pdf_file=get_demo_pdf()
89+
)
90+
comments = pdf.pdfcomment_set.all()
91+
92+
assert comments.count() == 2
93+
94+
with sync_playwright() as p:
95+
self.open(reverse('view_pdf', kwargs={'identifier': pdf.id}), p)
96+
sleep(0.5) # we need to wait a bit for the PDF to be loaded
97+
98+
self.page.locator("#editorFreeTextButton").click()
99+
self.page.locator(".annotationEditorLayer").first.click()
100+
# without <2068> not working
101+
self.page.get_by_role("region", name="Page ⁨1⁩").get_by_label("Text Editor").fill("1_some_new_comment")
102+
self.page.get_by_role("region", name="Page ⁨1⁩").get_by_label("Text Editor").press("Escape")
103+
self.page.locator("#savePdf").click()
104+
105+
# we need to wait a bit so the pdf is processed
106+
sleep(0.5)
107+
108+
changed_pdf = Pdf.objects.get(id=pdf.id)
109+
comments = changed_pdf.pdfcomment_set.all()
110+
111+
assert comments.count() == 3
112+
assert comments.order_by("text").first().text == "1_some_new_comment"

pdfding/pdf/templates/viewer.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@
460460
</div>
461461
<div class="toolbarHorizontalGroup" >
462462
{% if user_view_bool %}
463-
<button onclick="update_pdf('{{ pdf_id }}', '{% url 'update_pdf'%}', '{{ csrf_token }}', '{{ tab_title }}')" class="button1" title="Save">
463+
<button id="savePdf" onclick="update_pdf('{{ pdf_id }}', '{% url 'update_pdf'%}', '{{ csrf_token }}', '{{ tab_title }}')" class="button1" title="Save">
464464
<svg width="20px" height="20px" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
465465
<!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
466466
<!--Source: https://www.svgrepo.com/svg/502821/save-->

pdfding/templates/allauth/layouts/entrance.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
</div>
3838
{% endif %}
3939
</div>
40-
<div class="flex flex-col gap-y-4 justify-center items-center text-center h-8/10 text-slate-100 px-4">
40+
<div class="flex flex-col gap-y-4 justify-center items-center text-center h-8/10 text-slate-100 px-8">
4141
<span class="text-5xl font-bold">
4242
Take Control Over Your PDFs
4343
</span>

0 commit comments

Comments
 (0)