mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2025-07-16 02:16:16 +00:00
added a test case, updated coverage file
This commit is contained in:
@ -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,
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?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 -->
|
||||
<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
|
||||
<sources>
|
||||
@ -1292,7 +1292,7 @@
|
||||
</class>
|
||||
</classes>
|
||||
</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>
|
||||
<class name="__init__.py" filename="base/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
@ -1358,7 +1358,7 @@
|
||||
<line number="189" hits="1"/>
|
||||
</lines>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="5" hits="1"/>
|
||||
@ -1371,11 +1371,9 @@
|
||||
<line number="20" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="27" hits="1"/>
|
||||
<line number="36" hits="1"/>
|
||||
<line number="41" hits="0"/>
|
||||
</lines>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="4" hits="1"/>
|
||||
@ -1399,25 +1397,25 @@
|
||||
<line number="41" hits="1"/>
|
||||
<line number="44" hits="1"/>
|
||||
<line number="45" hits="1"/>
|
||||
<line number="50" hits="0"/>
|
||||
<line number="54" hits="0"/>
|
||||
<line number="55" hits="0"/>
|
||||
<line number="56" hits="0"/>
|
||||
<line number="58" hits="0"/>
|
||||
<line number="59" hits="0"/>
|
||||
<line number="60" hits="0"/>
|
||||
<line number="62" hits="0"/>
|
||||
<line number="50" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="55" hits="1"/>
|
||||
<line number="56" hits="1"/>
|
||||
<line number="58" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="62" hits="1"/>
|
||||
<line number="65" hits="1"/>
|
||||
<line number="66" hits="1"/>
|
||||
<line number="71" hits="0"/>
|
||||
<line number="80" hits="0"/>
|
||||
<line number="81" hits="0"/>
|
||||
<line number="82" hits="0"/>
|
||||
<line number="83" hits="0"/>
|
||||
<line number="85" hits="0"/>
|
||||
<line number="86" hits="0"/>
|
||||
<line number="87" hits="0"/>
|
||||
<line number="88" hits="0"/>
|
||||
<line number="71" hits="1"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="81" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="85" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="87" hits="1"/>
|
||||
<line number="88" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
</classes>
|
||||
@ -3858,7 +3856,7 @@
|
||||
</class>
|
||||
</classes>
|
||||
</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>
|
||||
<class name="__init__.py" filename="notifications/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
@ -3963,39 +3961,41 @@
|
||||
<line number="5" hits="1"/>
|
||||
<line number="8" hits="1"/>
|
||||
<line number="9" hits="1"/>
|
||||
<line number="12" hits="1"/>
|
||||
<line number="11" hits="1"/>
|
||||
<line number="13" hits="1"/>
|
||||
<line number="14" hits="1"/>
|
||||
<line number="17" hits="1"/>
|
||||
<line number="21" hits="1"/>
|
||||
<line number="26" hits="1"/>
|
||||
<line number="29" hits="1"/>
|
||||
<line number="32" hits="1"/>
|
||||
<line number="35" hits="1"/>
|
||||
<line number="38" hits="1"/>
|
||||
<line number="43" hits="1"/>
|
||||
<line number="49" hits="1"/>
|
||||
<line number="50" hits="1"/>
|
||||
<line number="51" hits="1"/>
|
||||
<line number="15" hits="1"/>
|
||||
<line number="18" hits="1"/>
|
||||
<line number="22" hits="1"/>
|
||||
<line number="27" hits="1"/>
|
||||
<line number="30" hits="1"/>
|
||||
<line number="33" hits="1"/>
|
||||
<line number="36" hits="1"/>
|
||||
<line number="39" hits="1"/>
|
||||
<line number="42" hits="1"/>
|
||||
<line number="47" hits="1"/>
|
||||
<line number="53" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="55" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="61" hits="1"/>
|
||||
<line number="66" hits="1"/>
|
||||
<line number="67" hits="1"/>
|
||||
<line number="69" hits="1"/>
|
||||
<line number="57" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="64" hits="1"/>
|
||||
<line number="65" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="71" hits="1"/>
|
||||
<line number="76" hits="1"/>
|
||||
<line number="77" hits="1"/>
|
||||
<line number="78" hits="1"/>
|
||||
<line number="73" hits="1"/>
|
||||
<line number="75" hits="1"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="81" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="87" hits="1"/>
|
||||
<line number="88" hits="1"/>
|
||||
<line number="84" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="91" hits="1"/>
|
||||
<line number="92" hits="1"/>
|
||||
<line number="93" hits="1"/>
|
||||
<line number="94" hits="1"/>
|
||||
<line number="95" hits="1"/>
|
||||
<line number="96" hits="1"/>
|
||||
<line number="97" hits="1"/>
|
||||
<line number="98" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<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"/>
|
||||
</lines>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="5" hits="1"/>
|
||||
@ -4034,75 +4034,63 @@
|
||||
<line number="41" hits="0"/>
|
||||
<line number="42" hits="0"/>
|
||||
<line number="45" hits="1"/>
|
||||
<line number="49" hits="0"/>
|
||||
<line number="50" hits="0"/>
|
||||
<line number="51" hits="0"/>
|
||||
<line number="52" hits="0"/>
|
||||
<line number="53" hits="0"/>
|
||||
<line number="49" hits="1"/>
|
||||
<line number="50" hits="1"/>
|
||||
<line number="51" hits="1"/>
|
||||
<line number="52" hits="1"/>
|
||||
<line number="53" hits="1"/>
|
||||
<line number="54" hits="0"/>
|
||||
<line number="55" hits="0"/>
|
||||
<line number="56" hits="0"/>
|
||||
<line number="57" hits="0"/>
|
||||
<line number="58" hits="0"/>
|
||||
<line number="59" hits="0"/>
|
||||
<line number="60" hits="0"/>
|
||||
<line number="61" hits="0"/>
|
||||
<line number="62" hits="0"/>
|
||||
<line number="63" hits="0"/>
|
||||
<line number="58" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="61" hits="1"/>
|
||||
<line number="62" hits="1"/>
|
||||
<line number="63" hits="1"/>
|
||||
<line number="66" hits="1"/>
|
||||
<line number="76" hits="0"/>
|
||||
<line number="77" hits="0"/>
|
||||
<line number="78" hits="0"/>
|
||||
<line number="79" hits="0"/>
|
||||
<line number="80" hits="0"/>
|
||||
<line number="81" hits="0"/>
|
||||
<line number="82" hits="0"/>
|
||||
<line number="83" hits="0"/>
|
||||
<line number="84" hits="0"/>
|
||||
<line number="86" hits="0"/>
|
||||
<line number="88" hits="0"/>
|
||||
<line number="89" hits="0"/>
|
||||
<line number="91" hits="0"/>
|
||||
<line number="92" hits="0"/>
|
||||
<line number="94" hits="0"/>
|
||||
<line number="95" hits="0"/>
|
||||
<line number="96" hits="0"/>
|
||||
<line number="76" hits="1"/>
|
||||
<line number="77" hits="1"/>
|
||||
<line number="78" hits="1"/>
|
||||
<line number="79" hits="1"/>
|
||||
<line number="80" hits="1"/>
|
||||
<line number="81" hits="1"/>
|
||||
<line number="82" hits="1"/>
|
||||
<line number="83" hits="1"/>
|
||||
<line number="84" hits="1"/>
|
||||
<line number="86" hits="1"/>
|
||||
<line number="88" hits="1"/>
|
||||
<line number="89" hits="1"/>
|
||||
<line number="91" hits="1"/>
|
||||
<line number="92" hits="1"/>
|
||||
<line number="94" hits="1"/>
|
||||
<line number="95" hits="1"/>
|
||||
<line number="96" hits="1"/>
|
||||
<line number="99" hits="1"/>
|
||||
<line number="100" hits="1"/>
|
||||
<line number="104" hits="0"/>
|
||||
<line number="106" hits="0"/>
|
||||
<line number="107" hits="0"/>
|
||||
<line number="109" hits="0"/>
|
||||
<line number="110" hits="0"/>
|
||||
<line number="104" hits="1"/>
|
||||
<line number="106" hits="1"/>
|
||||
<line number="107" hits="1"/>
|
||||
<line number="109" hits="1"/>
|
||||
<line number="110" hits="1"/>
|
||||
<line number="113" hits="1"/>
|
||||
<line number="115" hits="0"/>
|
||||
<line number="115" hits="1"/>
|
||||
<line number="120" hits="1"/>
|
||||
<line number="122" hits="0"/>
|
||||
<line number="122" hits="1"/>
|
||||
<line number="127" hits="1"/>
|
||||
<line number="128" hits="1"/>
|
||||
<line number="133" hits="0"/>
|
||||
<line number="136" hits="0"/>
|
||||
<line number="139" hits="0"/>
|
||||
<line number="140" hits="0"/>
|
||||
<line number="141" hits="0"/>
|
||||
<line number="145" hits="0"/>
|
||||
<line number="146" hits="0"/>
|
||||
<line number="147" hits="0"/>
|
||||
<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"/>
|
||||
<line number="133" hits="1"/>
|
||||
<line number="136" hits="1"/>
|
||||
<line number="139" hits="1"/>
|
||||
<line number="140" hits="1"/>
|
||||
<line number="141" hits="1"/>
|
||||
<line number="145" hits="1"/>
|
||||
<line number="146" hits="1"/>
|
||||
<line number="147" hits="1"/>
|
||||
</lines>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="5" hits="1"/>
|
||||
@ -4135,10 +4123,10 @@
|
||||
<line number="51" hits="1"/>
|
||||
<line number="53" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="59" hits="0"/>
|
||||
<line number="60" hits="0"/>
|
||||
<line number="61" hits="0"/>
|
||||
<line number="63" hits="0"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="61" hits="1"/>
|
||||
<line number="63" hits="1"/>
|
||||
<line number="65" hits="1"/>
|
||||
<line number="67" hits="1"/>
|
||||
<line number="71" hits="1"/>
|
||||
@ -4168,7 +4156,7 @@
|
||||
</class>
|
||||
</classes>
|
||||
</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>
|
||||
<class name="__init__.py" filename="web_admin/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
@ -4287,7 +4275,7 @@
|
||||
<line number="29" hits="1"/>
|
||||
</lines>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="4" hits="1"/>
|
||||
@ -4315,8 +4303,8 @@
|
||||
<line number="43" hits="0"/>
|
||||
<line number="46" hits="1"/>
|
||||
<line number="54" hits="1"/>
|
||||
<line number="55" hits="0"/>
|
||||
<line number="56" hits="0"/>
|
||||
<line number="55" hits="1"/>
|
||||
<line number="56" hits="1"/>
|
||||
<line number="58" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="61" hits="1"/>
|
||||
@ -4371,13 +4359,13 @@
|
||||
</class>
|
||||
</classes>
|
||||
</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>
|
||||
<class name="__init__.py" filename="web_admin/serializers/__init__.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
<methods/>
|
||||
<lines/>
|
||||
</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/>
|
||||
<lines>
|
||||
<line number="5" hits="1"/>
|
||||
@ -4439,15 +4427,14 @@
|
||||
<line number="128" hits="1"/>
|
||||
<line number="129" hits="1"/>
|
||||
<line number="130" hits="1"/>
|
||||
<line number="132" hits="0"/>
|
||||
<line number="134" hits="1"/>
|
||||
<line number="135" hits="1"/>
|
||||
<line number="140" hits="1"/>
|
||||
<line number="132" hits="1"/>
|
||||
<line number="133" hits="1"/>
|
||||
<line number="138" hits="1"/>
|
||||
<line number="139" hits="1"/>
|
||||
<line number="141" hits="1"/>
|
||||
<line number="143" hits="1"/>
|
||||
<line number="144" hits="1"/>
|
||||
<line number="149" hits="1"/>
|
||||
<line number="150" hits="1"/>
|
||||
<line number="142" hits="1"/>
|
||||
<line number="147" hits="1"/>
|
||||
<line number="148" hits="1"/>
|
||||
</lines>
|
||||
</class>
|
||||
<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="58" hits="1"/>
|
||||
<line number="59" hits="1"/>
|
||||
<line number="60" hits="1"/>
|
||||
<line number="62" hits="1"/>
|
||||
<line number="63" hits="1"/>
|
||||
<line number="64" hits="1"/>
|
||||
<line number="66" hits="1"/>
|
||||
<line number="68" hits="1"/>
|
||||
<line number="70" hits="1"/>
|
||||
<line number="72" hits="1"/>
|
||||
<line number="73" 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="81" hits="1"/>
|
||||
<line number="82" 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="91" hits="1"/>
|
||||
<line number="92" hits="1"/>
|
||||
<line number="93" hits="1"/>
|
||||
<line number="95" hits="1"/>
|
||||
<line number="96" 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>
|
||||
</class>
|
||||
<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="17" hits="1"/>
|
||||
<line number="20" hits="1"/>
|
||||
<line number="108" hits="1"/>
|
||||
<line number="109" hits="1"/>
|
||||
<line number="112" hits="1"/>
|
||||
<line number="117" hits="1"/>
|
||||
<line number="122" hits="1"/>
|
||||
<line number="123" hits="1"/>
|
||||
<line number="124" hits="1"/>
|
||||
<line number="110" hits="1"/>
|
||||
<line number="111" hits="1"/>
|
||||
<line number="114" hits="1"/>
|
||||
<line number="119" hits="1"/>
|
||||
<line number="125" hits="1"/>
|
||||
<line number="126" hits="1"/>
|
||||
<line number="127" hits="1"/>
|
||||
<line number="128" hits="1"/>
|
||||
<line number="130" hits="1"/>
|
||||
<line number="131" hits="1"/>
|
||||
<line number="134" hits="1"/>
|
||||
<line number="139" hits="1"/>
|
||||
<line number="144" hits="1"/>
|
||||
<line number="146" hits="1"/>
|
||||
<line number="148" hits="1"/>
|
||||
<line number="150" hits="1"/>
|
||||
<line number="152" hits="1"/>
|
||||
<line number="153" hits="1"/>
|
||||
<line number="132" hits="1"/>
|
||||
<line number="135" hits="1"/>
|
||||
<line number="137" hits="1"/>
|
||||
<line number="138" hits="1"/>
|
||||
<line number="141" hits="1"/>
|
||||
<line number="149" hits="1"/>
|
||||
<line number="156" hits="1"/>
|
||||
<line number="159" 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="184" hits="1"/>
|
||||
<line number="208" hits="1"/>
|
||||
<line number="219" hits="1"/>
|
||||
<line number="230" hits="1"/>
|
||||
<line number="261" hits="1"/>
|
||||
<line number="266" hits="1"/>
|
||||
<line number="271" hits="1"/>
|
||||
<line number="273" hits="1"/>
|
||||
<line number="274" hits="1"/>
|
||||
<line number="186" hits="1"/>
|
||||
<line number="194" hits="1"/>
|
||||
<line number="200" hits="1"/>
|
||||
<line number="224" hits="1"/>
|
||||
<line number="235" hits="1"/>
|
||||
<line number="246" hits="1"/>
|
||||
<line number="277" 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="293" hits="1"/>
|
||||
<line number="290" hits="1"/>
|
||||
<line number="291" hits="1"/>
|
||||
<line number="294" hits="1"/>
|
||||
<line number="295" hits="1"/>
|
||||
<line number="296" hits="1"/>
|
||||
<line number="299" hits="1"/>
|
||||
<line number="304" hits="1"/>
|
||||
<line number="305" hits="1"/>
|
||||
<line number="301" hits="1"/>
|
||||
<line number="302" hits="1"/>
|
||||
<line number="303" hits="1"/>
|
||||
<line number="306" hits="1"/>
|
||||
<line number="307" hits="1"/>
|
||||
<line number="310" hits="1"/>
|
||||
<line number="311" hits="1"/>
|
||||
<line number="313" hits="1"/>
|
||||
<line number="314" 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="327" hits="1"/>
|
||||
<line number="330" hits="1"/>
|
||||
<line number="335" hits="1"/>
|
||||
<line number="338" hits="1"/>
|
||||
<line number="343" hits="1"/>
|
||||
<line number="325" hits="1"/>
|
||||
<line number="326" hits="1"/>
|
||||
<line number="329" hits="1"/>
|
||||
<line number="334" hits="1"/>
|
||||
<line number="339" hits="1"/>
|
||||
<line number="346" hits="1"/>
|
||||
<line number="351" hits="1"/>
|
||||
<line number="354" hits="1"/>
|
||||
<line number="359" hits="1"/>
|
||||
<line number="349" hits="1"/>
|
||||
<line number="353" hits="1"/>
|
||||
<line number="358" hits="1"/>
|
||||
<line number="362" hits="1"/>
|
||||
<line number="367" hits="1"/>
|
||||
<line number="370" hits="1"/>
|
||||
<line number="375" hits="1"/>
|
||||
<line number="371" 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>
|
||||
</class>
|
||||
<class name="test_user_management.py" filename="web_admin/tests/test_user_management.py" complexity="0" line-rate="1" branch-rate="0">
|
||||
|
@ -8,6 +8,7 @@ from fcm_django.models import FCMDevice
|
||||
from django.urls import reverse
|
||||
from rest_framework import status
|
||||
|
||||
from account.models import UserNotification
|
||||
# local imports
|
||||
from account.serializers import GuardianSerializer
|
||||
from notifications.models import Notification
|
||||
@ -25,8 +26,11 @@ class NotificationTestCase(AnalyticsSetUp):
|
||||
"""
|
||||
super(NotificationTestCase, self).setUp()
|
||||
|
||||
# notification settings create
|
||||
UserNotification.objects.create(user=self.user)
|
||||
|
||||
# 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
|
||||
self.guardian_data = GuardianSerializer(
|
||||
@ -73,11 +77,11 @@ class NotificationTestCase(AnalyticsSetUp):
|
||||
test send test notification
|
||||
:return:
|
||||
"""
|
||||
url = reverse('notifications:notifications-list')
|
||||
url = reverse('notifications:notifications-test')
|
||||
response = self.client.get(url, **self.header)
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
# Assuming only one notification exists in the database
|
||||
self.assertEqual(Notification.objects.filter(notification_to=self.user).count(), 1)
|
||||
# Assuming one notification exists in the database and two created after api run
|
||||
self.assertEqual(Notification.objects.filter(notification_to=self.user).count(), 3)
|
||||
|
||||
def test_mark_as_read(self):
|
||||
"""
|
||||
|
@ -145,33 +145,3 @@ def send_notification_multiple_user(notification_type, from_user_id, from_user_t
|
||||
Notification.objects.bulk_create(notification_list)
|
||||
to_user_list = to_user_list.filter(user_notification__push_notification=True)
|
||||
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)
|
||||
|
@ -128,8 +128,6 @@ class UserCSVReportSerializer(serializers.ModelSerializer):
|
||||
return dict(USER_TYPE).get('2').capitalize()
|
||||
elif obj.junior_profile.all().first():
|
||||
return dict(USER_TYPE).get('1').capitalize()
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_is_active(obj):
|
||||
|
@ -49,6 +49,22 @@ class AnalyticsViewSetTestCase(AnalyticsSetUp):
|
||||
# Assuming four users exists in the database
|
||||
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):
|
||||
"""
|
||||
test assign tasks report
|
||||
|
@ -105,6 +105,8 @@ base64_image = ("data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBIS
|
||||
"rOORsR8oQkxdazE9A8QostdSBuBFvlKI6PY6ibg0z4VCscJi9WK3WzRiwmRqGHY3vndi5Hnebangse2hrpSHBEAjhE6rXj"
|
||||
"GYdEC/arYms/HtkfAS7huhuDXXJmPEkn5whN4xrZ0NkYdPRpIPdLS0kG5QPdCEskKlYcIWHCEJUO3KFuUIQD3QhCB//Z")
|
||||
|
||||
# export excel path and
|
||||
# export excel url
|
||||
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}"
|
||||
|
||||
@ -119,12 +121,17 @@ class BaseSetUp(APITestCase):
|
||||
user data
|
||||
:return:
|
||||
"""
|
||||
# user and admin email
|
||||
self.user_email = 'user@example.com'
|
||||
self.admin_email = 'admin@example.com'
|
||||
self.client = APIClient()
|
||||
|
||||
# create user
|
||||
self.user = User.objects.create_user(username=self.user_email, email=self.user_email)
|
||||
self.user.set_password('user@1234')
|
||||
self.user.save()
|
||||
|
||||
# create admin
|
||||
self.admin_user = User.objects.create_user(username=self.admin_email, email=self.admin_email,
|
||||
is_staff=True, is_superuser=True)
|
||||
self.admin_user.set_password('admin@1234')
|
||||
@ -133,22 +140,31 @@ class BaseSetUp(APITestCase):
|
||||
|
||||
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):
|
||||
"""
|
||||
set up data for test
|
||||
create user and admin
|
||||
create article, article card and article survey and survey options
|
||||
:return:
|
||||
"""
|
||||
super(ArticleTestSetUp, self).setUp()
|
||||
|
||||
# create article
|
||||
self.article = Article.objects.create(title="Existing Article", description="Existing Description",
|
||||
is_published=True)
|
||||
# create article card
|
||||
self.article_card = ArticleCard.objects.create(article=self.article, title="Existing Card 1",
|
||||
description="Existing Card 1 Description")
|
||||
# create article survey
|
||||
self.article_survey = ArticleSurvey.objects.create(article=self.article, points=5,
|
||||
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 2", is_answer=False)
|
||||
|
||||
@ -261,11 +277,12 @@ class ArticleTestSetUp(BaseSetUp):
|
||||
class UserManagementSetUp(BaseSetUp):
|
||||
"""
|
||||
test cases for user management
|
||||
users count, new sign-ups,
|
||||
"""
|
||||
|
||||
def setUp(self) -> None:
|
||||
"""
|
||||
data setup
|
||||
create new guardian and junior
|
||||
:return:
|
||||
"""
|
||||
super(UserManagementSetUp, self).setUp()
|
||||
@ -278,8 +295,9 @@ class UserManagementSetUp(BaseSetUp):
|
||||
country_name='India', gender=2, is_verified=True,
|
||||
guardian_code=self.guardian_code_1)
|
||||
|
||||
# user 2
|
||||
# user 2 email
|
||||
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.set_password('user2@1234')
|
||||
self.user_2.save()
|
||||
@ -289,19 +307,20 @@ class UserManagementSetUp(BaseSetUp):
|
||||
country_name='India', gender=1, is_verified=True,
|
||||
guardian_code=self.guardian_code_2)
|
||||
|
||||
# user 3
|
||||
# user 3 email
|
||||
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.set_password('user3@1234')
|
||||
self.user_3.save()
|
||||
|
||||
# junior 1
|
||||
self.junior = Junior.objects.create(auth=self.user_3, country_code=91, phone='8765887643',
|
||||
country_name='India', gender=2, is_verified=True,
|
||||
guardian_code=[self.guardian_code_1])
|
||||
self.junior = Junior.objects.create(auth=self.user_3, country_name='India', gender=2,
|
||||
is_verified=True, guardian_code=[self.guardian_code_1])
|
||||
|
||||
# user 4
|
||||
# user 4 email
|
||||
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.set_password('user4@1234')
|
||||
self.user_4.save()
|
||||
@ -315,61 +334,70 @@ class UserManagementSetUp(BaseSetUp):
|
||||
class AnalyticsSetUp(UserManagementSetUp):
|
||||
"""
|
||||
test analytics
|
||||
task assign report, junior leaderboard
|
||||
"""
|
||||
def setUp(self) -> None:
|
||||
"""
|
||||
test data set up
|
||||
create task and assigned to junior
|
||||
create junior points data
|
||||
:return:
|
||||
"""
|
||||
super(AnalyticsSetUp, self).setUp()
|
||||
|
||||
# pending tasks
|
||||
# pending tasks 1
|
||||
self.pending_task_1 = JuniorTask.objects.create(guardian=self.guardian, junior=self.junior,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
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,
|
||||
task_name='Expired Task 2', task_status=6,
|
||||
due_date='2024-09-11')
|
||||
due_date='2023-09-11')
|
||||
|
||||
# junior point table data
|
||||
JuniorPoints.objects.create(junior=self.junior_2, total_points=50)
|
||||
|
Reference in New Issue
Block a user