blob: bff73e0ba88eb7b128b431e1cf9371922847f382 [file] [log] [blame]
Oleksii Petrenko99539bd2020-07-31 20:00:06 +03001import datetime
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03002import json
3import os
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +01004from .celery_tasks import test_rail_api
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +03005
6from django.shortcuts import render, redirect, HttpResponse
7
8from . import models
9from . import forms
Anna Arhipova7cdcc852023-11-15 18:20:45 +010010from .celery_tasks.tasks import process_run, update_plot_data, \
11 get_test_passability_in_suite
12from .utils import short_names_for_dict, get_dict_diff
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030013
14
15def index(request):
Oleksii Petrenko68268172020-09-28 16:58:13 +030016 runs = models.TestRailTestRun.objects.all()
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030017 return render(request, "control/index.html", {"runs": runs})
18
19
20def redirect_to_index(request):
21 return redirect("index")
22
23
24def single_run(request, run_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030025 run = models.TestRailTestRun.objects.get(pk=run_id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030026 if request.method == "POST":
27 form = forms.TestRunForm(request.POST, instance=run)
28 if form.is_valid():
29 form.save()
30 return redirect("single_run", run_id)
31 else:
32 form = forms.TestRunForm(instance=run)
33
34 return render(request, "control/update_run.html",
Anna Arhipovae9258f32023-11-04 12:31:19 +010035 {"form": form, "run_id": run_id, "checked_tests":
36 run.checked_tests})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030037
38
39def create_run(request):
40 if request.method == "POST":
41 form = forms.TestRunForm(request.POST)
42 if form.is_valid():
43 obj = form.save()
44 return redirect("single_run", obj.id)
45 else:
46 form = forms.TestRunForm()
47
Anna Arhipova62760612023-11-28 23:20:38 +010048 form.fields["created_after"].initial = datetime.date.today() + \
49 datetime.timedelta(days=-3 * 30)
50 form.fields["created_before"].initial = datetime.date.today()
Anna Arhipova175d4712023-11-06 11:19:44 +010051 return render(request, "control/update_run.html", {"form": form})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030052
53
54def list_reports(request):
Oleksii Petrenko68268172020-09-28 16:58:13 +030055 reports = models.TestRailReport.objects.order_by("-created_at").all()
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030056 return render(request, "control/reports.html", {"reports": reports})
57
58
59def single_report(request, report_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030060 report = models.TestRailReport.objects.get(pk=report_id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030061 data = report.path.read().decode("utf-8")
Anna Arhipova7cdcc852023-11-15 18:20:45 +010062 if request.method == "POST" \
63 and request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030064 return HttpResponse(
65 json.dumps({"data": data, "finished": report.finished}),
66 content_type="application/json")
Anna Arhipova175d4712023-11-06 11:19:44 +010067
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030068 return render(request, "control/report.html",
Anna Arhipova175d4712023-11-06 11:19:44 +010069 {"report_id": report.id,
70 "report": data,
71 "finished": report.finished})
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030072
73
Anna Arhipova6ecdd342023-11-21 13:43:37 +010074def delete_report(request, report_id):
75 report:models.TestRailReport = models.TestRailReport.objects.get(pk=report_id)
76 try:
77 os.remove(report.path.path)
78 except FileNotFoundError:
79 pass
80 report.delete()
81 return redirect("list_reports")
82
83
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +030084def submit_run(request, run_id):
Oleksii Petrenko68268172020-09-28 16:58:13 +030085 run = models.TestRailTestRun.objects.get(pk=run_id)
Anna Arhipovae9258f32023-11-04 12:31:19 +010086 is_testplan = test_rail_api.is_testplan(run.run_id)
Anna Arhipovae9258f32023-11-04 12:31:19 +010087 if is_testplan:
88 testrail_run = test_rail_api.get_plan_by_id(run.run_id)
89 else:
90 testrail_run = test_rail_api.get_run_by_id(run.run_id)
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +010091 if not run.run_name:
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +010092 if is_testplan:
93 _name = f"Plan {testrail_run['name']}"
94 else:
95 parent_plan_id = testrail_run["plan_id"]
96 parent_plan_name = \
97 test_rail_api.get_plan_by_id(parent_plan_id)["name"]
98 _name = f"Run {testrail_run['name']} from {parent_plan_name}"
99 run.run_name = _name
100 run.save()
101
Sofiia Andriichenko4b440da2023-02-10 12:29:46 +0100102 report_name = "{}-run_id-{}-date-{}".format(
Anna Arhipovaf1ea3ee2024-01-24 13:29:09 +0100103 run.run_name,
104 run.run_id,
105 datetime.datetime.isoformat(datetime.datetime.now()))
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300106 path = os.path.join(models.fs.location, report_name)
107 with open(path, "w"):
108 pass
109
Oleksii Petrenko68268172020-09-28 16:58:13 +0300110 report = models.TestRailReport(
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300111 report_name=report_name,
112 path=path)
113 report.save()
Anna Arhipovae9258f32023-11-04 12:31:19 +0100114 process_run.delay(run_id, report.id, path, is_testplan)
Oleksii Petrenko12508832020-07-10 18:13:53 +0300115 return redirect("single_report", report.id)
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300116
117
Anna Arhipova52cdec92023-10-05 23:05:48 +0200118def delete_run(request, run_id):
119 run = models.TestRailTestRun.objects.get(pk=run_id)
120 run.delete()
121 return redirect("index")
122
123
Oleksii Petrenko24f1f8f2020-06-26 18:09:43 +0300124def show_help(request):
125 return render(request, "control/help.html")
Oleksii Petrenko68268172020-09-28 16:58:13 +0300126
127
128def update_jenkins_plot(request):
129 try:
130 models.ActionLog.objects.get(name="update_plot_started")
131 return HttpResponse("Update in progress", status=403)
132 except models.ActionLog.DoesNotExist:
133 pass
134 update = models.ActionLog(
135 name="update_plot_started", date=datetime.datetime.now())
136 update.save()
137 update_plot_data.delay()
138 return HttpResponse("Started Update", status=200)
139
140
141def jenkins_plot(request):
142 try:
143 update_date = models.ActionLog.objects.get(
144 name="update_jenkins_plot").date
145 except models.ActionLog.DoesNotExist:
146 update_date = None
147 try:
148 models.ActionLog.objects.get(name="update_plot_started")
149 update_started = True
150 except models.ActionLog.DoesNotExist:
151 update_started = False
152
153 job_names_path = os.path.join(models.fs.location, "job_names.txt")
154 job_names = []
155 if os.path.exists(job_names_path):
156 try:
157 with open(job_names_path, "r") as f:
158 job_names = json.load(f)
159 except:
160 pass
161
162 return render(
163 request, "control/jenkins_plot.html",
164 {"update_date": update_date, "update_started": update_started,
165 "job_names": enumerate(job_names, 1)})
Anna Arhipova7cdcc852023-11-15 18:20:45 +0100166
167
168def submit_suites(request):
169 form = forms.DiffPassRatesForm(request.POST)
170 if not form.is_valid():
171 print(f"{form.errors=}")
172 return
173 report1 = models.SuitePassRate(suite_id=request.POST["first-suite_id"])
174 report1.save()
175 report2 = models.SuitePassRate(suite_id=request.POST["second-suite_id"])
176 report2.save()
177
178 diff_model = models.DiffOfSuitesPassRates(
179 report1=report1,
180 report2=report2,
181 limit=form.cleaned_data["limit"],
182 test_keyword=form.cleaned_data["test_keyword"]
183 )
184 diff_model.save()
185 get_test_passability_in_suite.delay(diff_model.id, report1.id)
186 get_test_passability_in_suite.delay(diff_model.id, report2.id)
187
188 return redirect("report_comparing_suites", diff_model.id)
189
190
191def compare_suites(request):
192 if request.method == "POST":
193 return submit_suites(request)
194
195 diff_form = forms.DiffPassRatesForm()
196 report1_form = forms.SuitePassRateForm(prefix='first')
197 report2_form = forms.SuitePassRateForm(prefix='second')
198
199 return render(
200 request, "control/compare_suites.html",
201 {
202 "diff_form": diff_form,
203 "report1_form": report1_form,
204 "report2_form": report2_form,
205 "finished": None
206 })
207
208
209def list_of_comparing_reports(request):
210 list_of_reports = models.DiffOfSuitesPassRates.objects.all()
211 return render(
212 request, "control/list_comparing_suites.html",
213 {
214 "reports": list_of_reports
215 })
216
217
218def report_comparing_suites(request, report_id):
219 report = models.DiffOfSuitesPassRates.objects.get(pk=report_id)
220 passrate1 = short_names_for_dict(json.loads(
221 report.report1.passrate_by_tests))
222 passrate2 = short_names_for_dict(json.loads(
223 report.report2.passrate_by_tests))
224
225 diff_table = get_dict_diff(dict1=passrate1,
226 dict2=passrate2,
227 compare_by_key="rate")
228 diff_form = forms.DiffPassRatesForm(instance=report)
229 report1_form = forms.SuitePassRateForm(instance=report.report1,
230 prefix="first")
231 report2_form = forms.SuitePassRateForm(instance=report.report2,
232 prefix="second")
233
234 return render(
235 request, "control/compare_suites.html",
236 {"diff_form": diff_form,
237 "report1_form": report1_form,
238 "report2_form": report2_form,
239 "report1": report.report1,
240 "report2": report.report2,
241 "is_finished": report.report1.finished and report.report2.finished,
242 "diff_table": diff_table})