From patchwork Fri Nov 10 17:25:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34274 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1C0DC4167D for ; Fri, 10 Nov 2023 17:26:06 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33386.1699637157924545539 for ; Fri, 10 Nov 2023 09:25:58 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=MnjaNiiK; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 7962A9C34CE for ; Fri, 10 Nov 2023 12:25:56 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id 3iWf6g3pp8Ww; Fri, 10 Nov 2023 12:25:56 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 116E59C34CA; Fri, 10 Nov 2023 12:25:56 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 116E59C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637156; bh=TI85V8khtbmprk33aOMUsjCreVjcrl+rqvz3viKPjZs=; h=From:To:Date:Message-Id:MIME-Version; b=MnjaNiiKqdB1tGaVVw/hUJnH8yGhK02nu0SH10rCtmJAESPOCJbHnzy0coDPZcuYO VFHeK73xL0GLW2owvdLLyJgqfOnUH/1k+r7mmvaMcBZ4xjO8sH1glJu0Li/Wjk1WET qta4HgwcrLKFtBqCtEOf8+RPMuRX6yBmR9whRT+wLTGJGhq8sPUcG3y9aY1UJVLPmB 7/Ttbjp7prX918ZUdsLdM6r9QM48KFjuA/BZWPwvchgQZu4WTd0UW2z2ypoOJo8gv4 dhH3HBy321oQpkqQ1N1WXpoUq4XNDPvq6O6+EfP1K+iNTAJ214l2SHWvxFh99NBed7 KsycA0w+Tk55A== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id js0XVA46O0hp; Fri, 10 Nov 2023 12:25:55 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 23AEC9C328E; Fri, 10 Nov 2023 12:25:54 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 1/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:34 +0100 Message-Id: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:06 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5988 Test a message is shown when there are no build in all builds page Signed-off-by: Alassane Yattara --- lib/toaster/tests/browser/test_sample.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/toaster/tests/browser/test_sample.py b/lib/toaster/tests/browser/test_sample.py index b0067c21..73973778 100644 --- a/lib/toaster/tests/browser/test_sample.py +++ b/lib/toaster/tests/browser/test_sample.py @@ -27,3 +27,12 @@ class TestSample(SeleniumTestCase): self.get(url) brand_link = self.find('.toaster-navbar-brand a.brand') self.assertEqual(brand_link.text.strip(), 'Toaster') + + def test_no_builds_message(self): + """ Test that a message is shown when there are no builds """ + url = reverse('all-builds') + self.get(url) + div_msg = self.find('#empty-state-allbuildstable .alert-info') + + msg = 'Sorry - no data found' + self.assertEqual(div_msg.text, msg) From patchwork Fri Nov 10 17:25:35 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34279 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 630D2C05027 for ; Fri, 10 Nov 2023 17:26:07 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.33652.1699637158563214302 for ; Fri, 10 Nov 2023 09:25:59 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=CNLRmKxR; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id C461A9C34E1 for ; Fri, 10 Nov 2023 12:25:57 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id 3xx8qXyVQC-P; Fri, 10 Nov 2023 12:25:57 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 2D2DF9C34CA; Fri, 10 Nov 2023 12:25:57 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 2D2DF9C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637157; bh=kIEwiVjvzZ70K0VDS0bIX9+mWNuiMSLUBeif/iWD8FI=; h=From:To:Date:Message-Id:MIME-Version; b=CNLRmKxR8IWkZ9hvDJi8mTUH8QilnJ+tQ4w3bLSR6Qnd+ZTWEm6KAULYu+dzKjVxh r6Lw/6kRhK2/CNd4rwciYf+yYqOUow+vTa0Bpxhq1eFP/Am/hx0o1Whe6eBDgMEPGo M3jVHG0LcV/1QILrOwZ1hIOwV/AkQlnqNQbFrridza31hA9kc+qeaaWGPUarNdj6OE OBddVPLaLTkT9l08H2saK5U4aVvev8bwylCzB+VnhzcGxWyYrC80kcnrB+HUj+Qd1d 3fmx2rxgMlrb21e0Dv/vnp8H87+onIyMaVWLC3thPMIsxycWgBdIoEdxGmS3rJKSO6 rmE8U2ndAZe1g== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id qEb3XBd2XmxS; Fri, 10 Nov 2023 12:25:57 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 403F29C328E; Fri, 10 Nov 2023 12:25:56 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 2/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:35 +0100 Message-Id: <20231110172539.395060-2-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> References: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:07 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5989 Check search box for a build by recipe name Test the search box in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index d4312bb3..eb14f89d 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -11,6 +11,7 @@ import re, time from django.urls import reverse from django.utils import timezone +from selenium.webdriver.remote.webdriver import WebElement from tests.browser.selenium_helpers import SeleniumTestCase from orm.models import BitbakeVersion, Release, Project, Build, Target @@ -102,6 +103,18 @@ class TestAllBuildsPage(SeleniumTestCase): return found_row + def _get_create_builds(self, **kwargs): + """ Create a build and return the build object """ + build1 = Build.objects.create(**self.project1_build_success) + build2 = Build.objects.create(**self.project1_build_failure) + + # add some targets to these builds so they have recipe links + # (and so we can find the row in the ToasterTable corresponding to + # a particular build) + Target.objects.create(build=build1, target='foo') + Target.objects.create(build=build2, target='bar') + return build1, build2 + def test_show_tasks_with_suffix(self): """ Task should be shown as suffix on build name """ build = Build.objects.create(**self.project1_build_success) @@ -146,7 +159,6 @@ class TestAllBuildsPage(SeleniumTestCase): self.assertEqual(len(run_again_button), 0, 'should not see a rebuild button for cli builds') - def test_tooltips_on_project_name(self): """ Test tooltips shown next to project name in the main table @@ -188,14 +200,7 @@ class TestAllBuildsPage(SeleniumTestCase): recent builds area; failed builds should not have links on the time column, or in the recent builds area """ - build1 = Build.objects.create(**self.project1_build_success) - build2 = Build.objects.create(**self.project1_build_failure) - - # add some targets to these builds so they have recipe links - # (and so we can find the row in the ToasterTable corresponding to - # a particular build) - Target.objects.create(build=build1, target='foo') - Target.objects.create(build=build2, target='bar') + build1, build2 = self._get_create_builds() url = reverse('all-builds') self.get(url) @@ -223,3 +228,23 @@ class TestAllBuildsPage(SeleniumTestCase): links = build2_row.find_elements(By.CSS_SELECTOR, 'td.time a') msg = 'should not be a link on the build time for a failed build' self.assertEquals(len(links), 0, msg) + + def test_builds_table_search_box(self): + """ Test the search box in the builds table on the all builds page """ + self._get_create_builds() + + url = reverse('all-builds') + self.get(url) + + # Check search box is present and works + self.wait_until_present('#allbuildstable tbody tr') + search_box = self.find('#search-input-allbuildstable') + self.assertTrue(search_box.is_displayed()) + + # Check that we can search for a build by recipe name + search_box.send_keys('foo') + search_btn = self.find('#search-submit-allbuildstable') + search_btn.click() + self.wait_until_present('#allbuildstable tbody tr') + rows = self.find_all('#allbuildstable tbody tr') + self.assertTrue(len(rows) >= 1) From patchwork Fri Nov 10 17:25:36 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34275 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D1BC2C4167B for ; Fri, 10 Nov 2023 17:26:06 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33387.1699637159719401507 for ; Fri, 10 Nov 2023 09:25:59 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=maWGm811; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id C06689C34CE for ; Fri, 10 Nov 2023 12:25:58 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id 9nal3-TYNjiy; Fri, 10 Nov 2023 12:25:58 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 419999C34CA; Fri, 10 Nov 2023 12:25:58 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 419999C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637158; bh=dMSUvnJ4UdwccVBzbieZFfOxYEHmH/jbYoRYcw4DpHc=; h=From:To:Date:Message-Id:MIME-Version; b=maWGm811PBAYplfKd1PTtIP1BvyLRVe3xLjZxaazsL7QdZliOVyE5cdRnPIYEb1Id jhtmzAOIOKEX8EUGNjGM86dIHRBiRrM9MMJ5xASrZkpK5+5PmI+LyI+KIcywE0RKxp Jmb4muI7Pa48itcxmeXWivb6JZNn7r0VsKqTYJClQH3E6u6AdOvrMjVOyLFrSUN/FX 8QKao63q4AE1B757YDXIHut4RALqkKx4fJgzIl8pHGpuU8YKNzk8ykxFQljToHafRM NK7WMpmSInH3/qZiujJMcsB5v2UDav72Wcn0Mobpv5MfnIAqTVqB/fgWF2fsHwgbf5 i+0dbFSyMRwAA== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id BZ2oNgrIsiod; Fri, 10 Nov 2023 12:25:58 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 5F26A9C328E; Fri, 10 Nov 2023 12:25:57 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 3/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:36 +0100 Message-Id: <20231110172539.395060-3-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> References: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:06 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5990 Test the filtering on failure tasks column in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index eb14f89d..81498aa8 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -113,6 +113,20 @@ class TestAllBuildsPage(SeleniumTestCase): # a particular build) Target.objects.create(build=build1, target='foo') Target.objects.create(build=build2, target='bar') + + if kwargs: + # Create kwargs.get('success') builds with success status with target + # and kwargs.get('failure') builds with failure status with target + for i in range(kwargs.get('success', 0)): + build = Build.objects.create(**self.project1_build_success) + Target.objects.create(build=build, + target=f'{i}_success_recipe', + task=f'{i}_success_task') + for i in range(kwargs.get('failure', 0)): + build = Build.objects.create(**self.project1_build_failure) + Target.objects.create(build=build, + target=f'{i}_fail_recipe', + task=f'{i}_fail_task') return build1, build2 def test_show_tasks_with_suffix(self): @@ -248,3 +262,27 @@ class TestAllBuildsPage(SeleniumTestCase): self.wait_until_present('#allbuildstable tbody tr') rows = self.find_all('#allbuildstable tbody tr') self.assertTrue(len(rows) >= 1) + + def test_filtering_on_failure_tasks_column(self): + """ Test the filtering on failure tasks column in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + url = reverse('all-builds') + self.get(url) + + # Check filtering on failure tasks column + self.wait_until_present('#allbuildstable tbody tr') + failed_tasks_filter = self.find('#failed_tasks_filter') + failed_tasks_filter.click() + # Check popup is visible + time.sleep(1) + self.wait_until_present('#filter-modal-allbuildstable') + self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + # Check that we can filter by failure tasks + build_without_failure_tasks = self.find('#failed_tasks_filter\\:without_failed_tasks') + build_without_failure_tasks.click() + # click on apply button + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class + self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) From patchwork Fri Nov 10 17:25:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34277 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07F71C4332F for ; Fri, 10 Nov 2023 17:26:07 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33388.1699637161206381905 for ; Fri, 10 Nov 2023 09:26:01 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=lHlUSvN2; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 8DC939C328E for ; Fri, 10 Nov 2023 12:26:00 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id vCoN7MuekVEA; Fri, 10 Nov 2023 12:25:59 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 6038F9C34CA; Fri, 10 Nov 2023 12:25:59 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 6038F9C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637159; bh=Z4uYXMJhe7y0p2zC/cWsd+g2rYMbavpSCcRIKlcO6fE=; h=From:To:Date:Message-Id:MIME-Version; b=lHlUSvN28ajlh0mcl17+YJvUN6ehE1v/QaeerkCnGI35SyNqHvPmrQb2RxbsNNmBJ w4+aRsdmsTbwheLsq12BX+mRTw45mbzzV0ma6671sMSGdWmj/7dn2pWZ8lA6He+hfW zbf03DV+DUFDeYBpp3cgXFWF4tlOObcmYSr3zTtb29l2bH2p4+gzmsBzzSe5RdS7Id xoEUvQGlnSqJVwB7QgLw3dOT54O87jswjF2ICMennBh62gF/hxFqtl7heFVrW4QJ8n if05bhtgxaSBfFEV6m00tRxkFvAJ447lFZlXoQYoUsvP6R2g4TvKdFZPTSKdi68CaB 0VYBVfrEeL2BQ== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id infYzSM8gtO6; Fri, 10 Nov 2023 12:25:59 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 978D89C328E; Fri, 10 Nov 2023 12:25:58 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 4/6] Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:37 +0100 Message-Id: <20231110172539.395060-4-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> References: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:07 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5991 Test the filtering on completed_on column in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index 81498aa8..90dcdd91 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -11,10 +11,10 @@ import re, time from django.urls import reverse from django.utils import timezone -from selenium.webdriver.remote.webdriver import WebElement +from bldcontrol.models import BuildRequest from tests.browser.selenium_helpers import SeleniumTestCase -from orm.models import BitbakeVersion, Release, Project, Build, Target +from orm.models import BitbakeVersion, Layer, Layer_Version, Recipe, Release, Project, Build, Target, Task from selenium.webdriver.common.by import By @@ -118,17 +118,51 @@ class TestAllBuildsPage(SeleniumTestCase): # Create kwargs.get('success') builds with success status with target # and kwargs.get('failure') builds with failure status with target for i in range(kwargs.get('success', 0)): + now = timezone.now() + self.project1_build_success['started_on'] = now + self.project1_build_success[ + 'completed_on'] = now - timezone.timedelta(days=i) build = Build.objects.create(**self.project1_build_success) Target.objects.create(build=build, target=f'{i}_success_recipe', task=f'{i}_success_task') + + self._set_buildRequest_and_task_on_build(build) for i in range(kwargs.get('failure', 0)): + now = timezone.now() + self.project1_build_failure['started_on'] = now + self.project1_build_failure[ + 'completed_on'] = now - timezone.timedelta(days=i) build = Build.objects.create(**self.project1_build_failure) Target.objects.create(build=build, target=f'{i}_fail_recipe', task=f'{i}_fail_task') + self._set_buildRequest_and_task_on_build(build) return build1, build2 + def _create_recipe(self): + """ Add a recipe to the database and return it """ + layer = Layer.objects.create() + layer_version = Layer_Version.objects.create(layer=layer) + return Recipe.objects.create(name='recipe_foo', layer_version=layer_version) + + def _set_buildRequest_and_task_on_build(self, build): + """ Set buildRequest and task on build """ + build.recipes_parsed = 1 + build.save() + buildRequest = BuildRequest.objects.create( + build=build, + project=self.project1, + state=BuildRequest.REQ_COMPLETED) + build.build_request = buildRequest + recipe = self._create_recipe() + task = Task.objects.create(build=build, + recipe=recipe, + task_name='task', + outcome=Task.OUTCOME_SUCCESS) + task.save() + build.save() + def test_show_tasks_with_suffix(self): """ Task should be shown as suffix on build name """ build = Build.objects.create(**self.project1_build_success) @@ -286,3 +320,45 @@ class TestAllBuildsPage(SeleniumTestCase): self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) + + def test_filtering_on_completedOn_column(self): + """ Test the filtering on completed_on column in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + url = reverse('all-builds') + self.get(url) + + # Check filtering on failure tasks column + self.wait_until_present('#allbuildstable tbody tr') + completed_on_filter = self.find('#completed_on_filter') + completed_on_filter.click() + # Check popup is visible + time.sleep(1) + self.wait_until_present('#filter-modal-allbuildstable') + self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + # Check that we can filter by failure tasks + build_without_failure_tasks = self.find('#completed_on_filter\\:date_range') + build_without_failure_tasks.click() + # click on apply button + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + # Check if filter is applied, by checking if completed_on_filter has btn-primary class + self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + + # Filter by date range + self.find('#completed_on_filter').click() + self.wait_until_present('#filter-modal-allbuildstable') + date_ranges = self.driver.find_elements( + By.XPATH, '//input[@class="form-control hasDatepicker"]') + today = timezone.now() + yestersday = today - timezone.timedelta(days=1) + time.sleep(1) + date_ranges[0].send_keys(yestersday.strftime('%Y-%m-%d')) + date_ranges[1].send_keys(today.strftime('%Y-%m-%d')) + self.find('#filter-modal-allbuildstable .btn-primary').click() + self.wait_until_present('#allbuildstable tbody tr') + self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + # Check if filter is applied, number of builds displayed should be 6 + time.sleep(1) + self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) + From patchwork Fri Nov 10 17:25:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34276 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4509BC04A95 for ; Fri, 10 Nov 2023 17:26:07 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.33657.1699637161984308550 for ; Fri, 10 Nov 2023 09:26:02 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=lK9Lyg9e; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 0C6C79C34F2 for ; Fri, 10 Nov 2023 12:26:01 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id nUcBAnWbda_Z; Fri, 10 Nov 2023 12:26:00 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 798509C34CE; Fri, 10 Nov 2023 12:26:00 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 798509C34CE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637160; bh=D6hVVQ74vLWWYu83dRv5PN2yvxmOqshCGPltwrl7t/Y=; h=From:To:Date:Message-Id:MIME-Version; b=lK9Lyg9eeD2PUcwHJxthYLZVrEP4QHiM09lwAra/74Db+1je1FGAg3MJ1T+JgQj7x +ekRhuVNDASb8qAXu6r3kuDRnjDe/9YSybeRIs2khMdzUh3jkIhFiO4ujC8Adujjb6 Jd0AFir67m4Pi4tGIfRGK86QhlYOIlYc4KhM0GAvow7lSps7NE3sPxellB0LCa4bK1 mg2dMhYDtiWdU+PJE1epZ+0ir6aXeZ+ax+T7CXEEhOCBHa9ssty2dAg1n5x/vVBwRa QSaTcOFX98qkm5UzTeXVt9g0vQLvOYdeNfMt9Y3ogwWxOZ81JFUEhGC6cr+2i8ypQF nr6fh1z4ezahg== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id 0dqpbiNPCkFE; Fri, 10 Nov 2023 12:26:00 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id B5E719C328E; Fri, 10 Nov 2023 12:25:59 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 5/6] Toaster: Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:38 +0100 Message-Id: <20231110172539.395060-5-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> References: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:07 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5992 Test the edit column feature in the builds table on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index 90dcdd91..bd2b4799 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -362,3 +362,62 @@ class TestAllBuildsPage(SeleniumTestCase): time.sleep(1) self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) + def test_builds_table_editColumn(self): + """ Test the edit column feature in the builds table on the all builds page """ + self._get_create_builds(success=10, failure=10) + + def test_edit_column(check_box_id): + # Check that we can hide/show table column + check_box = self.find(f'#{check_box_id}') + th_class = str(check_box_id).replace('checkbox-', '') + if check_box.is_selected(): + # check if column is visible in table + self.assertTrue( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" + ) + check_box.click() + # check if column is hidden in table + self.assertFalse( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" + ) + else: + # check if column is hidden in table + self.assertFalse( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is unchecked in EditColumn dropdown, but it's visible in table" + ) + check_box.click() + # check if column is visible in table + self.assertTrue( + self.find( + f'#allbuildstable thead th.{th_class}' + ).is_displayed(), + f"The {th_class} column is checked in EditColumn dropdown, but it's not visible in table" + ) + url = reverse('all-builds') + self.get(url) + self.wait_until_present('#allbuildstable tbody tr') + + # Check edit column + edit_column = self.find('#edit-columns-button') + self.assertTrue(edit_column.is_displayed()) + edit_column.click() + # Check dropdown is visible + self.wait_until_visible('ul.dropdown-menu.editcol') + + # Check that we can hide the edit column + test_edit_column('checkbox-errors_no') + test_edit_column('checkbox-failed_tasks') + test_edit_column('checkbox-image_files') + test_edit_column('checkbox-project') + test_edit_column('checkbox-started_on') + test_edit_column('checkbox-time') + test_edit_column('checkbox-warnings_no') From patchwork Fri Nov 10 17:25:39 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34278 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 50110C05021 for ; Fri, 10 Nov 2023 17:26:07 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.33392.1699637163407870541 for ; Fri, 10 Nov 2023 09:26:03 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=fE9/hjuU; spf=pass (domain: savoirfairelinux.com, ip: 208.88.110.44, mailfrom: alassane.yattara@savoirfairelinux.com) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 680309C34E1 for ; Fri, 10 Nov 2023 12:26:02 -0500 (EST) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10032) with ESMTP id zIYyuu4EgC83; Fri, 10 Nov 2023 12:26:01 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 9E08C9C34CA; Fri, 10 Nov 2023 12:26:01 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 9E08C9C34CA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699637161; bh=k8xUK/W/cCZzp+uGrQYcUx1+24rxNatPO2UsIeBji2o=; h=From:To:Date:Message-Id:MIME-Version; b=fE9/hjuUyQoE///bPjW+afrzTi7G74mfhUsBIM2jlyj+UKq6v/JNlMX6vdhucjgJo xR/k6dx3pj3w33P4Of2XJamgLcAsoeJTX5GLjXTALFWm8QVhMmFPHnvkgR40c+Ydmc Z1XNq1P1b8Z/XMicoU2UoxmOulvoWLcchVfkFSmSPoJ3pAfv+h+wdl/i8VmksMGn+n vIIRLU17r9thy6Lb/pj6mjgWvFRIOWfDAbN8ckdFpw8htzAbqkbP42+Dy9HCr06Y2L +0yKTduWD6bfQJgJz9/c3fw21YsFG52hnTE3kauUf8Bj2HNprW3+hAQ8Mh/sZMREJd Qy1RSf6knkl/g== X-Virus-Scanned: amavis at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavis, port 10026) with ESMTP id wM2JGDfMjNop; Fri, 10 Nov 2023 12:26:01 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id BD7659C34EF; Fri, 10 Nov 2023 12:26:00 -0500 (EST) From: Alassane Yattara To: toaster@lists.yoctoproject.org Cc: Alassane Yattara Subject: [PATCH 6/6] Toaster: Toaster: Write UI TestCase -> Visualize all builds Date: Fri, 10 Nov 2023 18:25:39 +0100 Message-Id: <20231110172539.395060-6-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> References: <20231110172539.395060-1-alassane.yattara@savoirfairelinux.com> MIME-Version: 1.0 List-Id: X-Webhook-Received: from li982-79.members.linode.com [45.33.32.79] by aws-us-west-2-korg-lkml-1.web.codeaurora.org with HTTPS for ; Fri, 10 Nov 2023 17:26:07 -0000 X-Groupsio-URL: https://lists.yoctoproject.org/g/toaster/message/5993 Test the "show rows" feature in the builds table, on the all builds page Signed-off-by: Alassane Yattara --- .../tests/browser/test_all_builds_page.py | 64 +++++++++++++++---- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/lib/toaster/tests/browser/test_all_builds_page.py b/lib/toaster/tests/browser/test_all_builds_page.py index bd2b4799..4e9b9fd7 100644 --- a/lib/toaster/tests/browser/test_all_builds_page.py +++ b/lib/toaster/tests/browser/test_all_builds_page.py @@ -7,9 +7,11 @@ # SPDX-License-Identifier: GPL-2.0-only # -import re, time +import re +import time from django.urls import reverse +from selenium.webdriver.support.select import Select from django.utils import timezone from bldcontrol.models import BuildRequest from tests.browser.selenium_helpers import SeleniumTestCase @@ -151,13 +153,13 @@ class TestAllBuildsPage(SeleniumTestCase): build.recipes_parsed = 1 build.save() buildRequest = BuildRequest.objects.create( - build=build, + build=build, project=self.project1, state=BuildRequest.REQ_COMPLETED) build.build_request = buildRequest recipe = self._create_recipe() task = Task.objects.create(build=build, - recipe=recipe, + recipe=recipe, task_name='task', outcome=Task.OUTCOME_SUCCESS) task.save() @@ -189,7 +191,8 @@ class TestAllBuildsPage(SeleniumTestCase): but should be shown for other builds """ build1 = Build.objects.create(**self.project1_build_success) - default_build = Build.objects.create(**self.default_project_build_success) + default_build = Build.objects.create( + **self.default_project_build_success) url = reverse('all-builds') self.get(url) @@ -311,15 +314,18 @@ class TestAllBuildsPage(SeleniumTestCase): # Check popup is visible time.sleep(1) self.wait_until_present('#filter-modal-allbuildstable') - self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + self.assertTrue( + self.find('#filter-modal-allbuildstable').is_displayed()) # Check that we can filter by failure tasks - build_without_failure_tasks = self.find('#failed_tasks_filter\\:without_failed_tasks') + build_without_failure_tasks = self.find( + '#failed_tasks_filter\\:without_failed_tasks') build_without_failure_tasks.click() # click on apply button self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if failed_tasks_filter has btn-primary class - self.assertTrue(self.find('#failed_tasks_filter').get_attribute('class').find('btn-primary') != -1) + self.assertTrue(self.find('#failed_tasks_filter').get_attribute( + 'class').find('btn-primary') != -1) def test_filtering_on_completedOn_column(self): """ Test the filtering on completed_on column in the builds table on the all builds page """ @@ -335,16 +341,19 @@ class TestAllBuildsPage(SeleniumTestCase): # Check popup is visible time.sleep(1) self.wait_until_present('#filter-modal-allbuildstable') - self.assertTrue(self.find('#filter-modal-allbuildstable').is_displayed()) + self.assertTrue( + self.find('#filter-modal-allbuildstable').is_displayed()) # Check that we can filter by failure tasks - build_without_failure_tasks = self.find('#completed_on_filter\\:date_range') + build_without_failure_tasks = self.find( + '#completed_on_filter\\:date_range') build_without_failure_tasks.click() # click on apply button self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') # Check if filter is applied, by checking if completed_on_filter has btn-primary class - self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) - + self.assertTrue(self.find('#completed_on_filter').get_attribute( + 'class').find('btn-primary') != -1) + # Filter by date range self.find('#completed_on_filter').click() self.wait_until_present('#filter-modal-allbuildstable') @@ -357,7 +366,8 @@ class TestAllBuildsPage(SeleniumTestCase): date_ranges[1].send_keys(today.strftime('%Y-%m-%d')) self.find('#filter-modal-allbuildstable .btn-primary').click() self.wait_until_present('#allbuildstable tbody tr') - self.assertTrue(self.find('#completed_on_filter').get_attribute('class').find('btn-primary') != -1) + self.assertTrue(self.find('#completed_on_filter').get_attribute( + 'class').find('btn-primary') != -1) # Check if filter is applied, number of builds displayed should be 6 time.sleep(1) self.assertTrue(len(self.find_all('#allbuildstable tbody tr')) == 6) @@ -421,3 +431,33 @@ class TestAllBuildsPage(SeleniumTestCase): test_edit_column('checkbox-started_on') test_edit_column('checkbox-time') test_edit_column('checkbox-warnings_no') + + def test_builds_table_show_rows(self): + """ Test the show rows feature in the builds table on the all builds page """ + self._get_create_builds(success=100, failure=100) + + def test_show_rows(row_to_show, show_row_link): + # Check that we can show rows == row_to_show + show_row_link.select_by_value(str(row_to_show)) + self.wait_until_present('#allbuildstable tbody tr') + time.sleep(1) + self.assertTrue( + len(self.find_all('#allbuildstable tbody tr')) == row_to_show + ) + + url = reverse('all-builds') + self.get(url) + self.wait_until_present('#allbuildstable tbody tr') + + show_rows = self.driver.find_elements( + By.XPATH, + '//select[@class="form-control pagesize-allbuildstable"]' + ) + # Check show rows + for show_row_link in show_rows: + show_row_link = Select(show_row_link) + test_show_rows(10, show_row_link) + test_show_rows(25, show_row_link) + test_show_rows(50, show_row_link) + test_show_rows(100, show_row_link) + test_show_rows(150, show_row_link)