added a test case, updated coverage file

This commit is contained in:
abutalib-kiwi
2023-09-12 23:08:17 +05:30
parent af06dddbeb
commit 08f54f28a4
8 changed files with 253 additions and 255 deletions

BIN
.coverage

Binary file not shown.

View File

@ -32,15 +32,3 @@ class CustomPageNumberPagination(PageNumberPagination):
])) ]))
def get_paginated_dict_response(self, data):
"""
:param data: queryset to be paginated
:return: return a simple dict obj
"""
return {
'count': self.page.paginator.count,
'data': data,
'current_page': self.page.number,
'total_pages': self.page.paginator.num_pages,
}

View File

@ -1,5 +1,5 @@
<?xml version="1.0" ?> <?xml version="1.0" ?>
<coverage version="7.3.1" timestamp="1694511099137" lines-valid="5014" lines-covered="3385" line-rate="0.6751" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0"> <coverage version="7.3.1" timestamp="1694540167557" lines-valid="5008" lines-covered="3455" line-rate="0.6899" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.3.1 --> <!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.3.1 -->
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd --> <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
<sources> <sources>
@ -1292,7 +1292,7 @@
</class> </class>
</classes> </classes>
</package> </package>
<package name="base" line-rate="0.8235" branch-rate="0" complexity="0"> <package name="base" line-rate="1" branch-rate="0" complexity="0">
<classes> <classes>
<class name="__init__.py" filename="base/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <class name="__init__.py" filename="base/__init__.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
@ -1358,7 +1358,7 @@
<line number="189" hits="1"/> <line number="189" hits="1"/>
</lines> </lines>
</class> </class>
<class name="pagination.py" filename="base/pagination.py" complexity="0" line-rate="0.9167" branch-rate="0"> <class name="pagination.py" filename="base/pagination.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="5" hits="1"/> <line number="5" hits="1"/>
@ -1371,11 +1371,9 @@
<line number="20" hits="1"/> <line number="20" hits="1"/>
<line number="22" hits="1"/> <line number="22" hits="1"/>
<line number="27" hits="1"/> <line number="27" hits="1"/>
<line number="36" hits="1"/>
<line number="41" hits="0"/>
</lines> </lines>
</class> </class>
<class name="tasks.py" filename="base/tasks.py" complexity="0" line-rate="0.575" branch-rate="0"> <class name="tasks.py" filename="base/tasks.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="4" hits="1"/> <line number="4" hits="1"/>
@ -1399,25 +1397,25 @@
<line number="41" hits="1"/> <line number="41" hits="1"/>
<line number="44" hits="1"/> <line number="44" hits="1"/>
<line number="45" hits="1"/> <line number="45" hits="1"/>
<line number="50" hits="0"/> <line number="50" hits="1"/>
<line number="54" hits="0"/> <line number="54" hits="1"/>
<line number="55" hits="0"/> <line number="55" hits="1"/>
<line number="56" hits="0"/> <line number="56" hits="1"/>
<line number="58" hits="0"/> <line number="58" hits="1"/>
<line number="59" hits="0"/> <line number="59" hits="1"/>
<line number="60" hits="0"/> <line number="60" hits="1"/>
<line number="62" hits="0"/> <line number="62" hits="1"/>
<line number="65" hits="1"/> <line number="65" hits="1"/>
<line number="66" hits="1"/> <line number="66" hits="1"/>
<line number="71" hits="0"/> <line number="71" hits="1"/>
<line number="80" hits="0"/> <line number="80" hits="1"/>
<line number="81" hits="0"/> <line number="81" hits="1"/>
<line number="82" hits="0"/> <line number="82" hits="1"/>
<line number="83" hits="0"/> <line number="83" hits="1"/>
<line number="85" hits="0"/> <line number="85" hits="1"/>
<line number="86" hits="0"/> <line number="86" hits="1"/>
<line number="87" hits="0"/> <line number="87" hits="1"/>
<line number="88" hits="0"/> <line number="88" hits="1"/>
</lines> </lines>
</class> </class>
</classes> </classes>
@ -3858,7 +3856,7 @@
</class> </class>
</classes> </classes>
</package> </package>
<package name="notifications" line-rate="0.7288" branch-rate="0" complexity="0"> <package name="notifications" line-rate="0.9602" branch-rate="0" complexity="0">
<classes> <classes>
<class name="__init__.py" filename="notifications/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <class name="__init__.py" filename="notifications/__init__.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
@ -3963,39 +3961,41 @@
<line number="5" hits="1"/> <line number="5" hits="1"/>
<line number="8" hits="1"/> <line number="8" hits="1"/>
<line number="9" hits="1"/> <line number="9" hits="1"/>
<line number="12" hits="1"/> <line number="11" hits="1"/>
<line number="13" hits="1"/> <line number="13" hits="1"/>
<line number="14" hits="1"/> <line number="14" hits="1"/>
<line number="17" hits="1"/> <line number="15" hits="1"/>
<line number="21" hits="1"/> <line number="18" hits="1"/>
<line number="26" hits="1"/> <line number="22" hits="1"/>
<line number="29" hits="1"/> <line number="27" hits="1"/>
<line number="32" hits="1"/> <line number="30" hits="1"/>
<line number="35" hits="1"/> <line number="33" hits="1"/>
<line number="38" hits="1"/> <line number="36" hits="1"/>
<line number="43" hits="1"/> <line number="39" hits="1"/>
<line number="49" hits="1"/> <line number="42" hits="1"/>
<line number="50" hits="1"/> <line number="47" hits="1"/>
<line number="51" hits="1"/>
<line number="53" hits="1"/> <line number="53" hits="1"/>
<line number="54" hits="1"/>
<line number="55" hits="1"/> <line number="55" hits="1"/>
<line number="60" hits="1"/> <line number="57" hits="1"/>
<line number="61" hits="1"/> <line number="59" hits="1"/>
<line number="66" hits="1"/> <line number="64" hits="1"/>
<line number="67" hits="1"/> <line number="65" hits="1"/>
<line number="69" hits="1"/> <line number="70" hits="1"/>
<line number="71" hits="1"/> <line number="71" hits="1"/>
<line number="76" hits="1"/> <line number="73" hits="1"/>
<line number="77" hits="1"/> <line number="75" hits="1"/>
<line number="78" hits="1"/>
<line number="80" hits="1"/> <line number="80" hits="1"/>
<line number="81" hits="1"/>
<line number="82" hits="1"/> <line number="82" hits="1"/>
<line number="87" hits="1"/> <line number="84" hits="1"/>
<line number="88" hits="1"/> <line number="86" hits="1"/>
<line number="91" hits="1"/> <line number="91" hits="1"/>
<line number="92" hits="1"/> <line number="92" hits="1"/>
<line number="93" hits="1"/> <line number="95" hits="1"/>
<line number="94" hits="1"/> <line number="96" hits="1"/>
<line number="97" hits="1"/>
<line number="98" hits="1"/>
</lines> </lines>
</class> </class>
<class name="urls.py" filename="notifications/urls.py" complexity="0" line-rate="1" branch-rate="0"> <class name="urls.py" filename="notifications/urls.py" complexity="0" line-rate="1" branch-rate="0">
@ -4009,7 +4009,7 @@
<line number="16" hits="1"/> <line number="16" hits="1"/>
</lines> </lines>
</class> </class>
<class name="utils.py" filename="notifications/utils.py" complexity="0" line-rate="0.3295" branch-rate="0"> <class name="utils.py" filename="notifications/utils.py" complexity="0" line-rate="0.8947" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="5" hits="1"/> <line number="5" hits="1"/>
@ -4034,75 +4034,63 @@
<line number="41" hits="0"/> <line number="41" hits="0"/>
<line number="42" hits="0"/> <line number="42" hits="0"/>
<line number="45" hits="1"/> <line number="45" hits="1"/>
<line number="49" hits="0"/> <line number="49" hits="1"/>
<line number="50" hits="0"/> <line number="50" hits="1"/>
<line number="51" hits="0"/> <line number="51" hits="1"/>
<line number="52" hits="0"/> <line number="52" hits="1"/>
<line number="53" hits="0"/> <line number="53" hits="1"/>
<line number="54" hits="0"/> <line number="54" hits="0"/>
<line number="55" hits="0"/> <line number="55" hits="0"/>
<line number="56" hits="0"/> <line number="56" hits="0"/>
<line number="57" hits="0"/> <line number="57" hits="0"/>
<line number="58" hits="0"/> <line number="58" hits="1"/>
<line number="59" hits="0"/> <line number="59" hits="1"/>
<line number="60" hits="0"/> <line number="60" hits="1"/>
<line number="61" hits="0"/> <line number="61" hits="1"/>
<line number="62" hits="0"/> <line number="62" hits="1"/>
<line number="63" hits="0"/> <line number="63" hits="1"/>
<line number="66" hits="1"/> <line number="66" hits="1"/>
<line number="76" hits="0"/> <line number="76" hits="1"/>
<line number="77" hits="0"/> <line number="77" hits="1"/>
<line number="78" hits="0"/> <line number="78" hits="1"/>
<line number="79" hits="0"/> <line number="79" hits="1"/>
<line number="80" hits="0"/> <line number="80" hits="1"/>
<line number="81" hits="0"/> <line number="81" hits="1"/>
<line number="82" hits="0"/> <line number="82" hits="1"/>
<line number="83" hits="0"/> <line number="83" hits="1"/>
<line number="84" hits="0"/> <line number="84" hits="1"/>
<line number="86" hits="0"/> <line number="86" hits="1"/>
<line number="88" hits="0"/> <line number="88" hits="1"/>
<line number="89" hits="0"/> <line number="89" hits="1"/>
<line number="91" hits="0"/> <line number="91" hits="1"/>
<line number="92" hits="0"/> <line number="92" hits="1"/>
<line number="94" hits="0"/> <line number="94" hits="1"/>
<line number="95" hits="0"/> <line number="95" hits="1"/>
<line number="96" hits="0"/> <line number="96" hits="1"/>
<line number="99" hits="1"/> <line number="99" hits="1"/>
<line number="100" hits="1"/> <line number="100" hits="1"/>
<line number="104" hits="0"/> <line number="104" hits="1"/>
<line number="106" hits="0"/> <line number="106" hits="1"/>
<line number="107" hits="0"/> <line number="107" hits="1"/>
<line number="109" hits="0"/> <line number="109" hits="1"/>
<line number="110" hits="0"/> <line number="110" hits="1"/>
<line number="113" hits="1"/> <line number="113" hits="1"/>
<line number="115" hits="0"/> <line number="115" hits="1"/>
<line number="120" hits="1"/> <line number="120" hits="1"/>
<line number="122" hits="0"/> <line number="122" hits="1"/>
<line number="127" hits="1"/> <line number="127" hits="1"/>
<line number="128" hits="1"/> <line number="128" hits="1"/>
<line number="133" hits="0"/> <line number="133" hits="1"/>
<line number="136" hits="0"/> <line number="136" hits="1"/>
<line number="139" hits="0"/> <line number="139" hits="1"/>
<line number="140" hits="0"/> <line number="140" hits="1"/>
<line number="141" hits="0"/> <line number="141" hits="1"/>
<line number="145" hits="0"/> <line number="145" hits="1"/>
<line number="146" hits="0"/> <line number="146" hits="1"/>
<line number="147" hits="0"/> <line number="147" hits="1"/>
<line number="150" hits="1"/>
<line number="151" hits="1"/>
<line number="159" hits="0"/>
<line number="160" hits="0"/>
<line number="161" hits="0"/>
<line number="162" hits="0"/>
<line number="165" hits="1"/>
<line number="166" hits="1"/>
<line number="174" hits="0"/>
<line number="175" hits="0"/>
<line number="176" hits="0"/>
<line number="177" hits="0"/>
</lines> </lines>
</class> </class>
<class name="views.py" filename="notifications/views.py" complexity="0" line-rate="0.8947" branch-rate="0"> <class name="views.py" filename="notifications/views.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="5" hits="1"/> <line number="5" hits="1"/>
@ -4135,10 +4123,10 @@
<line number="51" hits="1"/> <line number="51" hits="1"/>
<line number="53" hits="1"/> <line number="53" hits="1"/>
<line number="54" hits="1"/> <line number="54" hits="1"/>
<line number="59" hits="0"/> <line number="59" hits="1"/>
<line number="60" hits="0"/> <line number="60" hits="1"/>
<line number="61" hits="0"/> <line number="61" hits="1"/>
<line number="63" hits="0"/> <line number="63" hits="1"/>
<line number="65" hits="1"/> <line number="65" hits="1"/>
<line number="67" hits="1"/> <line number="67" hits="1"/>
<line number="71" hits="1"/> <line number="71" hits="1"/>
@ -4168,7 +4156,7 @@
</class> </class>
</classes> </classes>
</package> </package>
<package name="web_admin" line-rate="0.8898" branch-rate="0" complexity="0"> <package name="web_admin" line-rate="0.9068" branch-rate="0" complexity="0">
<classes> <classes>
<class name="__init__.py" filename="web_admin/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <class name="__init__.py" filename="web_admin/__init__.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
@ -4287,7 +4275,7 @@
<line number="29" hits="1"/> <line number="29" hits="1"/>
</lines> </lines>
</class> </class>
<class name="utils.py" filename="web_admin/utils.py" complexity="0" line-rate="0.7667" branch-rate="0"> <class name="utils.py" filename="web_admin/utils.py" complexity="0" line-rate="0.8333" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="4" hits="1"/> <line number="4" hits="1"/>
@ -4315,8 +4303,8 @@
<line number="43" hits="0"/> <line number="43" hits="0"/>
<line number="46" hits="1"/> <line number="46" hits="1"/>
<line number="54" hits="1"/> <line number="54" hits="1"/>
<line number="55" hits="0"/> <line number="55" hits="1"/>
<line number="56" hits="0"/> <line number="56" hits="1"/>
<line number="58" hits="1"/> <line number="58" hits="1"/>
<line number="59" hits="1"/> <line number="59" hits="1"/>
<line number="61" hits="1"/> <line number="61" hits="1"/>
@ -4371,13 +4359,13 @@
</class> </class>
</classes> </classes>
</package> </package>
<package name="web_admin.serializers" line-rate="0.8996" branch-rate="0" complexity="0"> <package name="web_admin.serializers" line-rate="0.9014" branch-rate="0" complexity="0">
<classes> <classes>
<class name="__init__.py" filename="web_admin/serializers/__init__.py" complexity="0" line-rate="1" branch-rate="0"> <class name="__init__.py" filename="web_admin/serializers/__init__.py" complexity="0" line-rate="1" branch-rate="0">
<methods/> <methods/>
<lines/> <lines/>
</class> </class>
<class name="analytics_serializer.py" filename="web_admin/serializers/analytics_serializer.py" complexity="0" line-rate="0.9706" branch-rate="0"> <class name="analytics_serializer.py" filename="web_admin/serializers/analytics_serializer.py" complexity="0" line-rate="0.9851" branch-rate="0">
<methods/> <methods/>
<lines> <lines>
<line number="5" hits="1"/> <line number="5" hits="1"/>
@ -4439,15 +4427,14 @@
<line number="128" hits="1"/> <line number="128" hits="1"/>
<line number="129" hits="1"/> <line number="129" hits="1"/>
<line number="130" hits="1"/> <line number="130" hits="1"/>
<line number="132" hits="0"/> <line number="132" hits="1"/>
<line number="134" hits="1"/> <line number="133" hits="1"/>
<line number="135" hits="1"/> <line number="138" hits="1"/>
<line number="140" hits="1"/> <line number="139" hits="1"/>
<line number="141" hits="1"/> <line number="141" hits="1"/>
<line number="143" hits="1"/> <line number="142" hits="1"/>
<line number="144" hits="1"/> <line number="147" hits="1"/>
<line number="149" hits="1"/> <line number="148" hits="1"/>
<line number="150" hits="1"/>
</lines> </lines>
</class> </class>
<class name="article_serializer.py" filename="web_admin/serializers/article_serializer.py" complexity="0" line-rate="0.8186" branch-rate="0"> <class name="article_serializer.py" filename="web_admin/serializers/article_serializer.py" complexity="0" line-rate="0.8186" branch-rate="0">
@ -4920,24 +4907,31 @@
<line number="57" hits="1"/> <line number="57" hits="1"/>
<line number="58" hits="1"/> <line number="58" hits="1"/>
<line number="59" hits="1"/> <line number="59" hits="1"/>
<line number="60" hits="1"/> <line number="63" hits="1"/>
<line number="62" hits="1"/>
<line number="64" hits="1"/> <line number="64" hits="1"/>
<line number="66" hits="1"/> <line number="66" hits="1"/>
<line number="68" hits="1"/> <line number="68" hits="1"/>
<line number="70" hits="1"/> <line number="73" hits="1"/>
<line number="72" hits="1"/>
<line number="74" hits="1"/> <line number="74" hits="1"/>
<line number="79" hits="1"/> <line number="75" hits="1"/>
<line number="76" hits="1"/>
<line number="78" hits="1"/>
<line number="80" hits="1"/> <line number="80" hits="1"/>
<line number="81" hits="1"/>
<line number="82" hits="1"/> <line number="82" hits="1"/>
<line number="84" hits="1"/> <line number="84" hits="1"/>
<line number="89" hits="1"/> <line number="86" hits="1"/>
<line number="88" hits="1"/>
<line number="90" hits="1"/> <line number="90" hits="1"/>
<line number="91" hits="1"/> <line number="95" hits="1"/>
<line number="92" hits="1"/> <line number="96" hits="1"/>
<line number="93" hits="1"/> <line number="97" hits="1"/>
<line number="98" hits="1"/>
<line number="100" hits="1"/>
<line number="105" hits="1"/>
<line number="106" hits="1"/>
<line number="107" hits="1"/>
<line number="108" hits="1"/>
<line number="109" hits="1"/>
</lines> </lines>
</class> </class>
<class name="test_article.py" filename="web_admin/tests/test_article.py" complexity="0" line-rate="1" branch-rate="0"> <class name="test_article.py" filename="web_admin/tests/test_article.py" complexity="0" line-rate="1" branch-rate="0">
@ -5136,75 +5130,75 @@
<line number="14" hits="1"/> <line number="14" hits="1"/>
<line number="17" hits="1"/> <line number="17" hits="1"/>
<line number="20" hits="1"/> <line number="20" hits="1"/>
<line number="108" hits="1"/> <line number="110" hits="1"/>
<line number="109" hits="1"/> <line number="111" hits="1"/>
<line number="112" hits="1"/> <line number="114" hits="1"/>
<line number="117" hits="1"/> <line number="119" hits="1"/>
<line number="122" hits="1"/>
<line number="123" hits="1"/>
<line number="124" hits="1"/>
<line number="125" hits="1"/> <line number="125" hits="1"/>
<line number="126" hits="1"/> <line number="126" hits="1"/>
<line number="127" hits="1"/> <line number="127" hits="1"/>
<line number="128" hits="1"/>
<line number="130" hits="1"/> <line number="130" hits="1"/>
<line number="131" hits="1"/> <line number="131" hits="1"/>
<line number="134" hits="1"/> <line number="132" hits="1"/>
<line number="139" hits="1"/> <line number="135" hits="1"/>
<line number="144" hits="1"/> <line number="137" hits="1"/>
<line number="146" hits="1"/> <line number="138" hits="1"/>
<line number="148" hits="1"/> <line number="141" hits="1"/>
<line number="150" hits="1"/> <line number="149" hits="1"/>
<line number="152" hits="1"/>
<line number="153" hits="1"/>
<line number="156" hits="1"/> <line number="156" hits="1"/>
<line number="159" hits="1"/> <line number="159" hits="1"/>
<line number="162" hits="1"/> <line number="162" hits="1"/>
<line number="170" hits="1"/> <line number="165" hits="1"/>
<line number="168" hits="1"/>
<line number="169" hits="1"/>
<line number="172" hits="1"/>
<line number="175" hits="1"/>
<line number="178" hits="1"/> <line number="178" hits="1"/>
<line number="184" hits="1"/> <line number="186" hits="1"/>
<line number="208" hits="1"/> <line number="194" hits="1"/>
<line number="219" hits="1"/> <line number="200" hits="1"/>
<line number="230" hits="1"/> <line number="224" hits="1"/>
<line number="261" hits="1"/> <line number="235" hits="1"/>
<line number="266" hits="1"/> <line number="246" hits="1"/>
<line number="271" hits="1"/>
<line number="273" hits="1"/>
<line number="274" hits="1"/>
<line number="277" hits="1"/> <line number="277" hits="1"/>
<line number="282" hits="1"/> <line number="282" hits="1"/>
<line number="283" hits="1"/>
<line number="284" hits="1"/>
<line number="285" hits="1"/>
<line number="288" hits="1"/> <line number="288" hits="1"/>
<line number="293" hits="1"/> <line number="290" hits="1"/>
<line number="291" hits="1"/>
<line number="294" hits="1"/> <line number="294" hits="1"/>
<line number="295" hits="1"/>
<line number="296" hits="1"/>
<line number="299" hits="1"/> <line number="299" hits="1"/>
<line number="304" hits="1"/> <line number="301" hits="1"/>
<line number="305" hits="1"/> <line number="302" hits="1"/>
<line number="303" hits="1"/>
<line number="306" hits="1"/> <line number="306" hits="1"/>
<line number="307" hits="1"/> <line number="311" hits="1"/>
<line number="310" hits="1"/> <line number="313" hits="1"/>
<line number="314" hits="1"/>
<line number="315" hits="1"/> <line number="315" hits="1"/>
<line number="319" hits="1"/> <line number="318" hits="1"/>
<line number="322" hits="1"/>
<line number="324" hits="1"/> <line number="324" hits="1"/>
<line number="327" hits="1"/> <line number="325" hits="1"/>
<line number="330" hits="1"/> <line number="326" hits="1"/>
<line number="335" hits="1"/> <line number="329" hits="1"/>
<line number="338" hits="1"/> <line number="334" hits="1"/>
<line number="343" hits="1"/> <line number="339" hits="1"/>
<line number="346" hits="1"/> <line number="346" hits="1"/>
<line number="351" hits="1"/> <line number="349" hits="1"/>
<line number="354" hits="1"/> <line number="353" hits="1"/>
<line number="359" hits="1"/> <line number="358" hits="1"/>
<line number="362" hits="1"/> <line number="362" hits="1"/>
<line number="367" hits="1"/> <line number="367" hits="1"/>
<line number="370" hits="1"/> <line number="371" hits="1"/>
<line number="375" hits="1"/>
<line number="376" hits="1"/> <line number="376" hits="1"/>
<line number="379" hits="1"/> <line number="380" hits="1"/>
<line number="385" hits="1"/>
<line number="389" hits="1"/>
<line number="394" hits="1"/>
<line number="398" hits="1"/>
<line number="403" hits="1"/>
<line number="404" hits="1"/>
<line number="407" hits="1"/>
</lines> </lines>
</class> </class>
<class name="test_user_management.py" filename="web_admin/tests/test_user_management.py" complexity="0" line-rate="1" branch-rate="0"> <class name="test_user_management.py" filename="web_admin/tests/test_user_management.py" complexity="0" line-rate="1" branch-rate="0">

View File

@ -8,6 +8,7 @@ from fcm_django.models import FCMDevice
from django.urls import reverse from django.urls import reverse
from rest_framework import status from rest_framework import status
from account.models import UserNotification
# local imports # local imports
from account.serializers import GuardianSerializer from account.serializers import GuardianSerializer
from notifications.models import Notification from notifications.models import Notification
@ -25,8 +26,11 @@ class NotificationTestCase(AnalyticsSetUp):
""" """
super(NotificationTestCase, self).setUp() super(NotificationTestCase, self).setUp()
# notification settings create
UserNotification.objects.create(user=self.user)
# notification create # notification create
self.notification = Notification.objects.create(notification_to=self.user) self.notification = Notification.objects.create(notification_to=self.user, notification_from=self.user_3)
# to get guardian/user auth token # to get guardian/user auth token
self.guardian_data = GuardianSerializer( self.guardian_data = GuardianSerializer(
@ -73,11 +77,11 @@ class NotificationTestCase(AnalyticsSetUp):
test send test notification test send test notification
:return: :return:
""" """
url = reverse('notifications:notifications-list') url = reverse('notifications:notifications-test')
response = self.client.get(url, **self.header) response = self.client.get(url, **self.header)
self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.status_code, status.HTTP_200_OK)
# Assuming only one notification exists in the database # Assuming one notification exists in the database and two created after api run
self.assertEqual(Notification.objects.filter(notification_to=self.user).count(), 1) self.assertEqual(Notification.objects.filter(notification_to=self.user).count(), 3)
def test_mark_as_read(self): def test_mark_as_read(self):
""" """

View File

@ -145,33 +145,3 @@ def send_notification_multiple_user(notification_type, from_user_id, from_user_t
Notification.objects.bulk_create(notification_list) Notification.objects.bulk_create(notification_list)
to_user_list = to_user_list.filter(user_notification__push_notification=True) to_user_list = to_user_list.filter(user_notification__push_notification=True)
send_multiple_push(to_user_list, push_data) send_multiple_push(to_user_list, push_data)
@shared_task()
def send_notification_to_guardian(notification_type, from_user_id, to_user_id, extra_data):
"""
:param notification_type:
:param from_user_id:
:param to_user_id:
:param extra_data:
:return:
"""
if from_user_id:
from_user = Junior.objects.filter(auth_id=from_user_id).first()
extra_data['from_user_image'] = from_user.image
send_notification(notification_type, from_user_id, to_user_id, extra_data)
@shared_task()
def send_notification_to_junior(notification_type, from_user_id, to_user_id, extra_data):
"""
:param notification_type:
:param from_user_id:
:param to_user_id:
:param extra_data:
:return:
"""
if from_user_id:
from_user = Guardian.objects.filter(user_id=from_user_id).first()
extra_data['from_user_image'] = from_user.image
send_notification(notification_type, from_user_id, to_user_id, extra_data)

View File

@ -128,8 +128,6 @@ class UserCSVReportSerializer(serializers.ModelSerializer):
return dict(USER_TYPE).get('2').capitalize() return dict(USER_TYPE).get('2').capitalize()
elif obj.junior_profile.all().first(): elif obj.junior_profile.all().first():
return dict(USER_TYPE).get('1').capitalize() return dict(USER_TYPE).get('1').capitalize()
else:
return None
@staticmethod @staticmethod
def get_is_active(obj): def get_is_active(obj):

View File

@ -49,6 +49,22 @@ class AnalyticsViewSetTestCase(AnalyticsSetUp):
# Assuming four users exists in the database # Assuming four users exists in the database
self.assertEqual(response.data['data'][0]['signups'], 4) self.assertEqual(response.data['data'][0]['signups'], 4)
def test_new_user_sign_ups_between_given_dates(self):
"""
test new user sign-ups
:return:
"""
self.client.force_authenticate(self.admin_user)
url = reverse('web_admin:analytics-new-signups')
query_params = {
'start_date': '2023-09-12',
'end_date': '2023-09-13'
}
response = self.client.get(url, query_params)
self.assertEqual(response.status_code, status.HTTP_200_OK)
# Assuming four users exists in the database
self.assertEqual(response.data['data'][0]['signups'], 4)
def test_assign_tasks_report(self): def test_assign_tasks_report(self):
""" """
test assign tasks report test assign tasks report

View File

@ -105,6 +105,8 @@ base64_image = ("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBIS
"rOORsR8oQkxdazE9A8QostdSBuBFvlKI6PY6ibg0z4VCscJi9WK3WzRiwmRqGHY3vndi5Hnebangse2hrpSHBEAjhE6rXj" "rOORsR8oQkxdazE9A8QostdSBuBFvlKI6PY6ibg0z4VCscJi9WK3WzRiwmRqGHY3vndi5Hnebangse2hrpSHBEAjhE6rXj"
"GYdEC/arYms/HtkfAS7huhuDXXJmPEkn5whN4xrZ0NkYdPRpIPdLS0kG5QPdCEskKlYcIWHCEJUO3KFuUIQD3QhCB//Z") "GYdEC/arYms/HtkfAS7huhuDXXJmPEkn5whN4xrZ0NkYdPRpIPdLS0kG5QPdCEskKlYcIWHCEJUO3KFuUIQD3QhCB//Z")
# export excel path and
# export excel url
export_excel_path = 'analytics/ZOD_Bank_Analytics.xlsx' export_excel_path = 'analytics/ZOD_Bank_Analytics.xlsx'
export_excel_url = f"https://{settings.ALIYUN_OSS_BUCKET_NAME}.{settings.ALIYUN_OSS_ENDPOINT}/{export_excel_path}" export_excel_url = f"https://{settings.ALIYUN_OSS_BUCKET_NAME}.{settings.ALIYUN_OSS_ENDPOINT}/{export_excel_path}"
@ -119,12 +121,17 @@ class BaseSetUp(APITestCase):
user data user data
:return: :return:
""" """
# user and admin email
self.user_email = 'user@example.com' self.user_email = 'user@example.com'
self.admin_email = 'admin@example.com' self.admin_email = 'admin@example.com'
self.client = APIClient() self.client = APIClient()
# create user
self.user = User.objects.create_user(username=self.user_email, email=self.user_email) self.user = User.objects.create_user(username=self.user_email, email=self.user_email)
self.user.set_password('user@1234') self.user.set_password('user@1234')
self.user.save() self.user.save()
# create admin
self.admin_user = User.objects.create_user(username=self.admin_email, email=self.admin_email, self.admin_user = User.objects.create_user(username=self.admin_email, email=self.admin_email,
is_staff=True, is_superuser=True) is_staff=True, is_superuser=True)
self.admin_user.set_password('admin@1234') self.admin_user.set_password('admin@1234')
@ -133,22 +140,31 @@ class BaseSetUp(APITestCase):
class ArticleTestSetUp(BaseSetUp): class ArticleTestSetUp(BaseSetUp):
""" """
test cases data set up for article create, update test cases data set up
for article create, update, list, retrieve and
remove card, survey and add test card, list test card and
default image upload and list
""" """
def setUp(self): def setUp(self):
""" """
set up data for test set up data for test
create user and admin
create article, article card and article survey and survey options
:return: :return:
""" """
super(ArticleTestSetUp, self).setUp() super(ArticleTestSetUp, self).setUp()
# create article
self.article = Article.objects.create(title="Existing Article", description="Existing Description", self.article = Article.objects.create(title="Existing Article", description="Existing Description",
is_published=True) is_published=True)
# create article card
self.article_card = ArticleCard.objects.create(article=self.article, title="Existing Card 1", self.article_card = ArticleCard.objects.create(article=self.article, title="Existing Card 1",
description="Existing Card 1 Description") description="Existing Card 1 Description")
# create article survey
self.article_survey = ArticleSurvey.objects.create(article=self.article, points=5, self.article_survey = ArticleSurvey.objects.create(article=self.article, points=5,
question="Existing Survey Question 1") question="Existing Survey Question 1")
# create article survey options
SurveyOption.objects.create(survey=self.article_survey, option="Existing Option 1", is_answer=True) SurveyOption.objects.create(survey=self.article_survey, option="Existing Option 1", is_answer=True)
SurveyOption.objects.create(survey=self.article_survey, option="Existing Option 2", is_answer=False) SurveyOption.objects.create(survey=self.article_survey, option="Existing Option 2", is_answer=False)
@ -261,11 +277,12 @@ class ArticleTestSetUp(BaseSetUp):
class UserManagementSetUp(BaseSetUp): class UserManagementSetUp(BaseSetUp):
""" """
test cases for user management test cases for user management
users count, new sign-ups,
""" """
def setUp(self) -> None: def setUp(self) -> None:
""" """
data setup data setup
create new guardian and junior
:return: :return:
""" """
super(UserManagementSetUp, self).setUp() super(UserManagementSetUp, self).setUp()
@ -278,8 +295,9 @@ class UserManagementSetUp(BaseSetUp):
country_name='India', gender=2, is_verified=True, country_name='India', gender=2, is_verified=True,
guardian_code=self.guardian_code_1) guardian_code=self.guardian_code_1)
# user 2 # user 2 email
self.user_email_2 = 'user2@yopmail.com' self.user_email_2 = 'user2@yopmail.com'
# create user 2
self.user_2 = User.objects.create_user(username=self.user_email_2, email=self.user_email_2) self.user_2 = User.objects.create_user(username=self.user_email_2, email=self.user_email_2)
self.user_2.set_password('user2@1234') self.user_2.set_password('user2@1234')
self.user_2.save() self.user_2.save()
@ -289,19 +307,20 @@ class UserManagementSetUp(BaseSetUp):
country_name='India', gender=1, is_verified=True, country_name='India', gender=1, is_verified=True,
guardian_code=self.guardian_code_2) guardian_code=self.guardian_code_2)
# user 3 # user 3 email
self.user_email_3 = 'user3@yopmail.com' self.user_email_3 = 'user3@yopmail.com'
# create user 3
self.user_3 = User.objects.create_user(username=self.user_email_3, email=self.user_email_3) self.user_3 = User.objects.create_user(username=self.user_email_3, email=self.user_email_3)
self.user_3.set_password('user3@1234') self.user_3.set_password('user3@1234')
self.user_3.save() self.user_3.save()
# junior 1 # junior 1
self.junior = Junior.objects.create(auth=self.user_3, country_code=91, phone='8765887643', self.junior = Junior.objects.create(auth=self.user_3, country_name='India', gender=2,
country_name='India', gender=2, is_verified=True, is_verified=True, guardian_code=[self.guardian_code_1])
guardian_code=[self.guardian_code_1])
# user 4 # user 4 email
self.user_email_4 = 'user4@yopmail.com' self.user_email_4 = 'user4@yopmail.com'
# create user 4
self.user_4 = User.objects.create_user(username=self.user_email_4, email=self.user_email_4) self.user_4 = User.objects.create_user(username=self.user_email_4, email=self.user_email_4)
self.user_4.set_password('user4@1234') self.user_4.set_password('user4@1234')
self.user_4.save() self.user_4.save()
@ -315,61 +334,70 @@ class UserManagementSetUp(BaseSetUp):
class AnalyticsSetUp(UserManagementSetUp): class AnalyticsSetUp(UserManagementSetUp):
""" """
test analytics test analytics
task assign report, junior leaderboard
""" """
def setUp(self) -> None: def setUp(self) -> None:
""" """
test data set up test data set up
create task and assigned to junior
create junior points data
:return: :return:
""" """
super(AnalyticsSetUp, self).setUp() super(AnalyticsSetUp, self).setUp()
# pending tasks # pending tasks 1
self.pending_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.pending_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='Pending Task 1', task_status=1, task_name='Pending Task 1', task_status=1,
due_date='2024-09-12') due_date='2023-09-12')
# pending tasks 2
self.pending_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.pending_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='Pending Task 2', task_status=1, task_name='Pending Task 2', task_status=1,
due_date='2024-09-12') due_date='2023-09-12')
# in progress tasks # in progress tasks 1
self.in_progress_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.in_progress_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='In progress Task 1', task_status=2, task_name='In progress Task 1', task_status=2,
due_date='2024-09-12') due_date='2023-09-12')
# in progress tasks 2
self.in_progress_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.in_progress_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='In progress Task 2', task_status=2, task_name='In progress Task 2', task_status=2,
due_date='2024-09-12') due_date='2023-09-12')
# rejected tasks # rejected tasks 1
self.rejected_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.rejected_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='Rejected Task 1', task_status=3, task_name='Rejected Task 1', task_status=3,
due_date='2024-09-12') due_date='2023-09-12')
# rejected tasks 2
self.rejected_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.rejected_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='Rejected Task 2', task_status=3, task_name='Rejected Task 2', task_status=3,
due_date='2024-09-12') due_date='2023-09-12')
# requested task # requested task 1
self.requested_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.requested_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='Requested Task 1', task_status=4, task_name='Requested Task 1', task_status=4,
due_date='2024-09-12') due_date='2023-09-12')
# requested task 2
self.requested_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.requested_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='Requested Task 2', task_status=4, task_name='Requested Task 2', task_status=4,
due_date='2024-09-12') due_date='2023-09-12')
# completed task # completed task 1
self.completed_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.completed_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='Completed Task 1', task_status=5, task_name='Completed Task 1', task_status=5,
due_date='2024-09-12') due_date='2023-09-12')
# completed task 2
self.completed_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.completed_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='Completed Task 2', task_status=5, task_name='Completed Task 2', task_status=5,
due_date='2024-09-12') due_date='2023-09-12')
# expired task # expired task 1
self.expired_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior, self.expired_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
task_name='Expired Task 1', task_status=6, task_name='Expired Task 1', task_status=6,
due_date='2024-09-11') due_date='2023-09-11')
# expired task 2
self.expired_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2, self.expired_task_2 = JuniorTask.objects.create(guardian=self.guardian_2, junior=self.junior_2,
task_name='Expired Task 2', task_status=6, task_name='Expired Task 2', task_status=6,
due_date='2024-09-11') due_date='2023-09-11')
# junior point table data # junior point table data
JuniorPoints.objects.create(junior=self.junior_2, total_points=50) JuniorPoints.objects.create(junior=self.junior_2, total_points=50)