Skip to content

Commit 3998494

Browse files
committed
starting with pytest
1 parent 1df26fb commit 3998494

File tree

26 files changed

+336
-133
lines changed

26 files changed

+336
-133
lines changed

.github/workflows/frontend.yml

Lines changed: 0 additions & 21 deletions
This file was deleted.

.github/workflows/test.yml

Lines changed: 0 additions & 44 deletions
This file was deleted.

.github/workflows/unittests.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: Test django-filer
2+
3+
on:
4+
push:
5+
branches:
6+
- finder
7+
paths-ignore:
8+
- '**.md'
9+
- '**.rst'
10+
- '/docs/**'
11+
pull_request:
12+
branches:
13+
- develop
14+
paths-ignore:
15+
- '**.md'
16+
- '**.rst'
17+
- '/docs/**'
18+
19+
jobs:
20+
build:
21+
runs-on: ubuntu-latest
22+
strategy:
23+
matrix:
24+
python-version: ["3.11", "3.12"]
25+
django-version: ["5.2.*"]
26+
node-version: ["18.x"]
27+
28+
steps:
29+
- uses: actions/checkout@v3
30+
- name: Use Node.js ${{ matrix.node-version }}
31+
uses: actions/setup-node@v2
32+
with:
33+
node-version: ${{ matrix.node-version }}
34+
- name: Set up Python ${{ matrix.python-version }}
35+
uses: actions/setup-python@v2
36+
with:
37+
python-version: ${{ matrix.python-version }}
38+
- name: Install dependencies
39+
run: |
40+
npm install --include=dev
41+
python -m pip install --upgrade pip
42+
python -m pip install https://github.com/django/django/archive/refs/heads/main.zip
43+
python -m pip install django-cte django-entangled ffmpeg-python pillow reportlab svglib
44+
python -m pip install beautifulsoup4 coverage Faker lxml pytest pytest-django pytest-cov
45+
- name: Build Client
46+
run: |
47+
npm run compilescss
48+
npm run esbuild
49+
- name: Test with pytest
50+
run: |
51+
python -m pytest -v demoapp/unittests

client/scss/finder-admin.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -695,4 +695,3 @@ ul.messagelist {
695695
}
696696

697697
@import 'node_modules/react-image-crop/src/ReactCrop.scss';
698-
@import 'node_modules/react-h5-audio-player/src/styles.scss';

demoapp/e2etests/__init__.py

Whitespace-only changes.

demoapp/e2etests/conftest.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import os
2+
import pytest
3+
4+
from playwright.sync_api import sync_playwright
5+
6+
from django.conf import settings
7+
from django.core.management import call_command
8+
from django.urls import reverse
9+
10+
from finder.models.realm import RealmModel
11+
12+
from ..utils import create_random_image
13+
14+
os.environ.setdefault('DJANGO_ALLOW_ASYNC_UNSAFE', 'true')
15+
16+
17+
@pytest.fixture(autouse=True, scope='session')
18+
def create_assets():
19+
os.makedirs(settings.BASE_DIR / 'workdir/assets', exist_ok=True)
20+
for counter in range(10):
21+
image = create_random_image()
22+
image.save(settings.BASE_DIR / 'workdir/assets' / f'image_{counter:01d}.png')
23+
24+
25+
@pytest.fixture(scope='session')
26+
def django_db_setup(django_db_blocker):
27+
database_file = settings.BASE_DIR / 'workdir/test_db.sqlite3'
28+
settings.DATABASES['default']['NAME'] = database_file
29+
with django_db_blocker.unblock():
30+
call_command('migrate', verbosity=0)
31+
yield
32+
os.remove(database_file)
33+
34+
35+
@pytest.fixture
36+
def realm(admin_client):
37+
if realm := RealmModel.objects.first():
38+
return realm
39+
response = admin_client.get(reverse('admin:finder_foldermodel_changelist'))
40+
assert response.status_code == 302
41+
realm = RealmModel.objects.first()
42+
assert realm is not None
43+
redirected = reverse('admin:finder_inodemodel_change', kwargs={'inode_id': realm.root_folder.id})
44+
assert response.url == redirected
45+
assert realm.root_folder.is_folder is True
46+
assert realm.root_folder.is_trash is False
47+
assert realm.root_folder.owner == response.wsgi_request.user
48+
assert realm.root_folder.name == '__root__'
49+
assert realm.root_folder.parent is None
50+
assert realm.root_folder.is_root
51+
assert realm.trash_folders.count() == 0
52+
return realm
53+
54+
55+
class Connector:
56+
def __init__(self, live_server):
57+
print(f"\nStarting end-to-end test server at {live_server}\n")
58+
self.live_server = live_server
59+
60+
def __enter__(self):
61+
def print_args(msg):
62+
if msg.type in ['info', 'debug']:
63+
return
64+
for arg in msg.args:
65+
print(arg.json_value())
66+
67+
self.playwright = sync_playwright().start()
68+
self.browser = self.playwright.chromium.launch()
69+
return self
70+
71+
def __exit__(self, exc_type, exc_val, exc_tb):
72+
self.browser.close()
73+
self.playwright.stop()
74+
75+
76+
@pytest.fixture(scope='session')
77+
def connector(live_server):
78+
with Connector(live_server) as connector:
79+
yield connector
80+
81+
82+
@pytest.fixture
83+
def locale():
84+
return 'en-US'
85+
86+
87+
@pytest.fixture
88+
def language():
89+
return 'en'
90+
91+
92+
def print_args(msg):
93+
"""
94+
Print messages from the browser console.
95+
"""
96+
for arg in msg.args:
97+
print(arg.json_value())
98+
99+
100+
@pytest.fixture()
101+
def page(connector, viewname, locale, language):
102+
context = connector.browser.new_context(locale=locale)
103+
context.add_cookies([{'name': 'django_language', 'value': language, 'domain': 'localhost', 'path': '/'}])
104+
page = context.new_page()
105+
# page.on('console', print_args)
106+
page.goto(connector.live_server.url + reverse(viewname))
107+
# django_formset = page.locator('django-formset:defined')
108+
# django_formset.wait_for()
109+
return page

demoapp/pytest.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[pytest]
2+
DJANGO_SETTINGS_MODULE = demoapp.settings
3+
django_find_project = false
4+
addopts = --tb=native

demoapp/settings.py

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@
3434
'django.contrib.messages',
3535
'django.contrib.sites',
3636
'django.contrib.staticfiles',
37-
'easy_thumbnails',
38-
'filer',
3937
'finder',
4038
'finder.contrib.archive',
4139
'finder.contrib.audio',
@@ -75,24 +73,25 @@
7573
WSGI_APPLICATION = 'wsgi.application'
7674

7775

78-
# Database
79-
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases
80-
81-
DATABASES = {
82-
'default': {
83-
'ENGINE': 'django.db.backends.sqlite3',
84-
'NAME': BASE_DIR / 'workdir/db.sqlite3',
85-
},
86-
'default_': {
87-
'ENGINE': 'django.db.backends.postgresql',
88-
'NAME': 'finder',
89-
'USER': 'finder',
90-
'PASSWORD': '',
91-
'HOST': 'localhost',
92-
'PORT': 5432,
93-
# 'CONN_MAX_AGE': 900,
94-
},
95-
}
76+
if os.getenv('USE_POSTGRES', False) in ['1', 'True', 'true']:
77+
DATABASES = {
78+
'default': {
79+
'ENGINE': 'django.db.backends.postgresql',
80+
'NAME': 'finder',
81+
'USER': 'finder',
82+
'PASSWORD': '',
83+
'HOST': 'localhost',
84+
'PORT': 5432,
85+
# 'CONN_MAX_AGE': 900,
86+
},
87+
}
88+
else:
89+
DATABASES = {
90+
'default': {
91+
'ENGINE': 'django.db.backends.sqlite3',
92+
'NAME': BASE_DIR / 'workdir/db.sqlite3',
93+
},
94+
}
9695

9796

9897
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

demoapp/unittests/__init__.py

Whitespace-only changes.

demoapp/unittests/conftest.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import os
2+
import pytest
3+
4+
from django.conf import settings
5+
from django.core.management import call_command
6+
from django.urls import reverse
7+
8+
from finder.models.realm import RealmModel
9+
10+
from ..utils import create_random_image
11+
12+
os.environ.setdefault('DJANGO_ALLOW_ASYNC_UNSAFE', 'true')
13+
14+
15+
@pytest.fixture(autouse=True, scope='session')
16+
def create_assets():
17+
os.makedirs(settings.BASE_DIR / 'workdir/assets', exist_ok=True)
18+
for counter in range(10):
19+
image = create_random_image()
20+
image.save(settings.BASE_DIR / 'workdir/assets' / f'image_{counter:01d}.png')
21+
22+
23+
@pytest.fixture(scope='session')
24+
def django_db_setup(django_db_blocker):
25+
database_file = settings.BASE_DIR / 'workdir/test_db.sqlite3'
26+
settings.DATABASES['default']['NAME'] = database_file
27+
with django_db_blocker.unblock():
28+
call_command('migrate', verbosity=0)
29+
yield
30+
os.remove(database_file)
31+
32+
33+
@pytest.fixture
34+
def realm(admin_client):
35+
if realm := RealmModel.objects.first():
36+
return realm
37+
response = admin_client.get(reverse('admin:finder_foldermodel_changelist'))
38+
assert response.status_code == 302
39+
realm = RealmModel.objects.first()
40+
assert realm is not None
41+
redirected = reverse('admin:finder_inodemodel_change', kwargs={'inode_id': realm.root_folder.id})
42+
assert response.url == redirected
43+
assert realm.root_folder.is_folder is True
44+
assert realm.root_folder.is_trash is False
45+
assert realm.root_folder.owner == response.wsgi_request.user
46+
assert realm.root_folder.name == '__root__'
47+
assert realm.root_folder.parent is None
48+
assert realm.root_folder.is_root
49+
assert realm.trash_folders.count() == 0
50+
return realm

0 commit comments

Comments
 (0)