Skip to content

Commit 5bb2a19

Browse files
committed
The changes made in this commit include:
- Added `link_preview` import in `models.py` - Modified `get_preview` method in `Link` model to return `LinkPreview` object - Added `SignalListViewTest` class in `tests.py` - Added test methods for `SignalListView` in `tests.py` - Modified `get_queryset` method in `SignalsListView` to call `get_base_diffs` for each object in the queryset - Added `get_context_data` method in `SignalsListView`
1 parent 77a7368 commit 5bb2a19

File tree

6 files changed

+201
-2
lines changed

6 files changed

+201
-2
lines changed

src/base/factories.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from factory import Sequence
2+
from factory.django import DjangoModelFactory
3+
from faker import Faker
4+
5+
from base.models import Link, LinkTypeChoices
6+
7+
fake = Faker()
8+
9+
10+
class LinkFactory(DjangoModelFactory):
11+
"""
12+
A factory for the Link model.
13+
"""
14+
class Meta:
15+
model = Link
16+
17+
link_type = fake.random_element(LinkTypeChoices.values)
18+
url = Sequence(lambda n: f'http://www.{n}.org/')

src/base/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.db import models
22
from django.utils.translation import gettext_lazy as _
3-
from linkpreview import link_preview
3+
from linkpreview import LinkPreview, link_preview
44

55

66
class LinkTypeChoices(models.TextChoices):
@@ -43,7 +43,7 @@ def __str__(self) -> str:
4343
"""
4444
return self.url
4545

46-
def get_preview(self):
46+
def get_preview(self) -> LinkPreview:
4747
"""
4848
Returns a preview of the link using the link_preview library.
4949

src/datasources/factories.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from factory import Sequence, SubFactory
2+
from factory.django import DjangoModelFactory
3+
from faker import Faker
4+
5+
from datasources.models import DataSource, SourceSubdivision
6+
7+
fake = Faker()
8+
9+
10+
class DataSourceFactory(DjangoModelFactory):
11+
"""
12+
A factory for the DataSource model.
13+
"""
14+
class Meta:
15+
model = DataSource
16+
17+
name = Sequence(lambda n: f'{n}')
18+
display_name = Sequence(lambda n: f'{n}')
19+
20+
21+
class SourceSubdivisionFactory(DjangoModelFactory):
22+
"""
23+
A factory for the SourceSubdivision model.
24+
"""
25+
class Meta:
26+
model = SourceSubdivision
27+
28+
name = Sequence(lambda n: f'{n}')
29+
display_name = Sequence(lambda n: f'{n}')
30+
description = fake.text()
31+
db_source = fake.word()
32+
data_source = SubFactory(DataSourceFactory)

src/signals/factories.py

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
from factory import (
2+
Sequence,
3+
SubFactory,
4+
post_generation,
5+
)
6+
from factory.django import DjangoModelFactory
7+
from faker import Faker
8+
9+
from base.factories import LinkFactory
10+
from datasources.factories import SourceSubdivisionFactory
11+
from signals.models import (
12+
FormatChoices,
13+
Geography,
14+
HighValuesAreChoices,
15+
Pathogen,
16+
Signal,
17+
SignalCategory,
18+
SignalType,
19+
TimeLabelChoices,
20+
TimeTypeChoices,
21+
)
22+
23+
fake = Faker()
24+
25+
26+
class GeographyFactory(DjangoModelFactory):
27+
"""
28+
A factory for the Geography model.
29+
"""
30+
class Meta:
31+
model = Geography
32+
33+
name = Sequence(lambda n: f'{n}')
34+
35+
36+
class PathogenFactory(DjangoModelFactory):
37+
"""
38+
A factory for the Pathogen model.
39+
"""
40+
class Meta:
41+
model = Pathogen
42+
43+
name = Sequence(lambda n: f'{n}')
44+
45+
46+
class SignalCategoryFactory(DjangoModelFactory):
47+
"""
48+
A factory for the SignalCategory model.
49+
"""
50+
class Meta:
51+
model = SignalCategory
52+
53+
name = Sequence(lambda n: f'{n}')
54+
55+
56+
class SignalTypeFactory(DjangoModelFactory):
57+
"""
58+
A factory for the SignalType model.
59+
"""
60+
class Meta:
61+
model = SignalType
62+
63+
name = Sequence(lambda n: f'{n}')
64+
65+
66+
class SignalFactory(DjangoModelFactory):
67+
"""
68+
A factory for the Signal model.
69+
"""
70+
name = Sequence(lambda n: f'{n}')
71+
active = fake.boolean()
72+
short_description = fake.text(max_nb_chars=500)
73+
description = fake.text(max_nb_chars=500)
74+
format = fake.random_element(FormatChoices.values)
75+
time_type = fake.random_element(TimeTypeChoices.values)
76+
time_label = fake.random_element(TimeLabelChoices.values)
77+
category = SubFactory(SignalCategoryFactory)
78+
is_smoothed = fake.boolean()
79+
is_weighted = fake.boolean()
80+
is_cumulative = fake.boolean()
81+
has_stderr = fake.boolean()
82+
high_values_are = fake.random_element(HighValuesAreChoices.values)
83+
source = SubFactory(SourceSubdivisionFactory)
84+
85+
class Meta:
86+
model = Signal
87+
88+
@post_generation
89+
def generate_pathogens(self, create, extracted, **kwargs):
90+
if not create or not extracted:
91+
for _ in range(fake.random_int(min=1, max=10)):
92+
self.pathogen.add(PathogenFactory())
93+
return
94+
95+
@post_generation
96+
def generate_signal_types(self, create, extracted, **kwargs):
97+
if not create or not extracted:
98+
for _ in range(fake.random_int(min=1, max=10)):
99+
self.signal_type.add(SignalTypeFactory())
100+
return
101+
102+
@post_generation
103+
def generate_links(self, create, extracted, **kwargs):
104+
if not create or not extracted:
105+
for _ in range(fake.random_int(min=1, max=10)):
106+
self.links.add(LinkFactory())
107+
return
108+
109+
@post_generation
110+
def generate_available_geography(self, create, extracted, **kwargs):
111+
if not create or not extracted:
112+
for _ in range(fake.random_int(min=1, max=10)):
113+
self.available_geography.add(GeographyFactory())
114+
return

src/signals/tests.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from django.test import TestCase
2+
from django.urls import reverse
3+
from faker import Faker
4+
5+
from signals.factories import SignalFactory
6+
7+
fake = Faker()
8+
9+
10+
class SignalListViewTest(TestCase):
11+
12+
def setUp(self):
13+
for i in range(fake.random_int(min=1, max=100)):
14+
SignalFactory()
15+
16+
def test_signal_list_view(self):
17+
response = self.client.get(reverse('signals'))
18+
self.assertEqual(response.status_code, 200)
19+
self.assertTemplateUsed(response, 'signals/signal_list.html')
20+
21+
def test_signal_list_view_context(self):
22+
response = self.client.get(reverse('signals'))
23+
self.assertTrue('signals' in response.context)
24+
self.assertTrue('is_paginated' in response.context)
25+
self.assertTrue('page_obj' in response.context)
26+
self.assertTrue('paginator' in response.context)
27+
self.assertTrue('filter' in response.context)
28+
29+
def test_signal_list_view_filter_by_pathogen(self):
30+
signal = SignalFactory()
31+
response = self.client.get(reverse('signals'), {'pathogen': signal.pathogen.first().id})
32+
self.assertEqual(response.status_code, 200)
33+
self.assertEqual(response.context['signals'].count(), 1)

src/signals/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class SignalsListView(ListView):
1616
def get_queryset(self):
1717
queryset = super().get_queryset()
1818
f = SignalFilter(self.request.GET, queryset=queryset)
19+
for i in queryset:
20+
i.get_base_diffs()
1921
return f.qs
2022

2123
def get_context_data(self, **kwargs):

0 commit comments

Comments
 (0)