From patchwork Tue Nov 14 14:28:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34457 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 D2547C4167B for ; Tue, 14 Nov 2023 14:28:21 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.13760.1699972092701103448 for ; Tue, 14 Nov 2023 06:28:13 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=l6OJXLjl; 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 53EF59C3552 for ; Tue, 14 Nov 2023 09:28:11 -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 P9QOnCOALYim; Tue, 14 Nov 2023 09:28:10 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id A960C9C3452; Tue, 14 Nov 2023 09:28:10 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com A960C9C3452 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972090; bh=2kxm0JRfXtfgkO2UEcagNUKzcVFTWLExsjeiRQGlogs=; h=From:To:Date:Message-Id:MIME-Version; b=l6OJXLjlGYxGntcpHRgpHyOyQBhpcr8i92nA8Qk7QaWIQU1n5VArlwHNXwlSgz9Pt vfz1EfCm49L8KHbO+fpLnStcc8QogvxAftFJ2Mc8l2zF8uuE1uCHjq7Q/LDAgDG6qC TwVZg9IFkoBmtI3MPl0zUIMEj1KbdzmY+Jr2iZd01lTwEYqHdchkOIdpxzdT7UPzbc c1jkhiXJQPYmUtNd5K3Qf75P5h/PeexagVGx1+ZbzyZB3HopD0yuv+RNldeQmtzgnt KNG0yBRktPP80RfhTKBfLTgBFmkdnf+NQeD6BM1AID51lDqssoEmMm3fwvbUXVn7qo r/TmyWUqCfGpA== 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 fJoCyJU8medz; Tue, 14 Nov 2023 09:28:10 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 1633E9C320B; Tue, 14 Nov 2023 09:28:09 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 1/6] Toaster: Write UI TestCase -> Test if 'no build' message is shown Date: Tue, 14 Nov 2023 15:28:01 +0100 Message-Id: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:21 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15520 In all builds page, check if 'no build' message is shown when there are no build. 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 Tue Nov 14 14:28:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34458 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 D2517C4332F for ; Tue, 14 Nov 2023 14:28:21 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.13784.1699972093103549559 for ; Tue, 14 Nov 2023 06:28:13 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=U8Ba4TY3; 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 598D29C3596 for ; Tue, 14 Nov 2023 09:28:12 -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 lpeDEXX-h9Za; Tue, 14 Nov 2023 09:28:11 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id BABA49C3452; Tue, 14 Nov 2023 09:28:11 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com BABA49C3452 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972091; bh=twnepvkhTDy00mIDQqNgLPrnHR9+yC/0gVty8Trp6MI=; h=From:To:Date:Message-Id:MIME-Version; b=U8Ba4TY3Q01fd4ZazWku+jTolp8H5EFNwZpa4oLdti8Q43iiDSQBUwA4zoPNciiKz s2Fau4B5EphOUYK/j2w3n7zuTzK3B3TPcgLVSDalRotwAhSgbRldPedRRV2yEogP/D PbTdPsu/LNqgLsDxx6KBmX5Na7ze2j4YoA0njAuemWTWfSrWSJLkqEDSEXXTq8orZz 88sLtAkVfEH0xAQQeAxIr2NcPGptg7khX9585gxtTXDUGlzwSFezwq3/UzW6wQUwmN oNEFsVPTvNut82wygTTpKHvq+FEc3I1AmribchmJ5C3Ib8eJMUGK5pLj+VLRAcXlSX f6fZ9NZwCo3gA== 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 e3s1FfcvMAeX; Tue, 14 Nov 2023 09:28:11 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 098369C354D; Tue, 14 Nov 2023 09:28:10 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 2/6] Toaster: Write UI TestCase -> Test search box on all build page Date: Tue, 14 Nov 2023 15:28:02 +0100 Message-Id: <20231114142806.53894-2-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231114142806.53894-1-alassane.yattara@savoirfairelinux.com> References: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:21 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15521 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 Tue Nov 14 14:28:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34459 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 450A1C4167D for ; Tue, 14 Nov 2023 14:28:22 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.13786.1699972093865359245 for ; Tue, 14 Nov 2023 06:28:14 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=kvYvu3ht; 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 33AB49C3452 for ; Tue, 14 Nov 2023 09:28:13 -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 JTanMFwzgWFZ; Tue, 14 Nov 2023 09:28:12 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id B87FE9C0760; Tue, 14 Nov 2023 09:28:12 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com B87FE9C0760 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972092; bh=dMSUvnJ4UdwccVBzbieZFfOxYEHmH/jbYoRYcw4DpHc=; h=From:To:Date:Message-Id:MIME-Version; b=kvYvu3htUgrOdsciSAgJr+ddrghtnGCoYAAEcNdGo/2JpN13kawwl0WfN0kPv/Se1 uGtz1xnOdTc3cgwAZIEfBk7F330F6vyGaMRUJOqYv6liwFva9XRpb9lYOThBWz1nFE fOprA/7koIyDoyQcmjMM+X5cB3GueIOHmI0ORbSfus2ZjTVUfvKu0FXE8hVSKfY2Vr i1titemK0DRtabhhGp5EpdZg0OPdlyuP1XoIdRTIi8iei+sXByFZzdbYBjV9W0wXoz qiynqdbfTWcc4nQDbrzlab7JYz89XhjLbwFH+I308h5uyC5wzeCk7kY25ygxPdejgQ ASUUSm/LDxNzQ== 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 B211Co4Z1_P0; Tue, 14 Nov 2023 09:28:12 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id E85B89C354D; Tue, 14 Nov 2023 09:28:11 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 3/6] Toaster: Write UI TestCase -> Test the filtering feature on 'failure tasks' column Date: Tue, 14 Nov 2023 15:28:03 +0100 Message-Id: <20231114142806.53894-3-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231114142806.53894-1-alassane.yattara@savoirfairelinux.com> References: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:22 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15522 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 Tue Nov 14 14:28:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34461 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 54AAAC07524 for ; Tue, 14 Nov 2023 14:28:22 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.13787.1699972095775482045 for ; Tue, 14 Nov 2023 06:28:15 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=Of/2qrc3; 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 1EDC09C3452 for ; Tue, 14 Nov 2023 09:28:15 -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 qTQGEg4MadBl; Tue, 14 Nov 2023 09:28:14 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id E8F7B9C0760; Tue, 14 Nov 2023 09:28:13 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com E8F7B9C0760 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972093; bh=Z4uYXMJhe7y0p2zC/cWsd+g2rYMbavpSCcRIKlcO6fE=; h=From:To:Date:Message-Id:MIME-Version; b=Of/2qrc3Lp8k6uA3dzlqkkv0imK/i3/uawwWUTAaejPLFFijOekoIRVdcYrYg2YLx tRvCbilJ/eMjosgjJhgWTylU8edWGwLgl8r5TAVcRsJHXHXZyOSEIUAXU0gpdqsITG 9ZF25QRr5bGPhTlatNGGfts3uhudm+vxGi4ay1iYTvevmqjxreCBMwxg0dWJbfhDzK LFOOycW01DdjSmHEji323vHuBfjdQ+2LWTnD6QM5jxyrYmD2QFyomQY6rDUnstA+bt aSnaw8Qkb1BBwzvnarNkLMsngO/e6bUjEb6U5bMPwV70SiIETSeidvJza16ZFSC2b3 yPZ71NllHIWzA== 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 wTVW57-e1bKV; Tue, 14 Nov 2023 09:28:13 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 150C39C2C19; Tue, 14 Nov 2023 09:28:12 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 4/6] Toaster: Write UI TestCase -> Test filtering feature on 'completed_on' column Date: Tue, 14 Nov 2023 15:28:04 +0100 Message-Id: <20231114142806.53894-4-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231114142806.53894-1-alassane.yattara@savoirfairelinux.com> References: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:22 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15523 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 Tue Nov 14 14:28:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34462 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 59625C074FD for ; Tue, 14 Nov 2023 14:28:22 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web10.13763.1699972096423730338 for ; Tue, 14 Nov 2023 06:28:16 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=Qm23DI5H; 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 B85069C32D6 for ; Tue, 14 Nov 2023 09:28:15 -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 yhAWTOpH1ZWm; Tue, 14 Nov 2023 09:28:15 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 345169C0760; Tue, 14 Nov 2023 09:28:15 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 345169C0760 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972095; bh=47T7fC9y3szZG3LQCsBF9cLsv3Vr9K2AHE7gzCHsMPM=; h=From:To:Date:Message-Id:MIME-Version; b=Qm23DI5HNqdvi5h85KAPHXYMhYKZ+D9xQOdR8EQi4RsNC3fv+yJ5G87NMiHdQm0XN 0Bsd0erTm2G+c+/LjJ55kEivVZMEN1NVxZjRMnl/L1gvAmmiHFEuzQBDpU0iIdeNs3 /heVMScXI5TF/O8e5tK6HubrIMEAsKbSeE2Sag+MRPOOCy8XjeoYUGUWzzL0ZBhds+ clVpLuviz6ihc7+pcVGOlILF6MrXbkBELatTRACIHML4r9nqJBNu0qDLEmji1IVgy4 T0X7BhYkKluJv3nWqlkzXua6tasHpw7luD22bXIWTLJXZn4YNxtCnS1IOzibKqAvW5 kO/u26RyhdJKQ== 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 lZaKbQwlRbqB; Tue, 14 Nov 2023 09:28:15 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 4CEAB9C2C19; Tue, 14 Nov 2023 09:28:14 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 5/6] Toaster: Write UI TestCase -> Test "edit column" feature show/hide column Date: Tue, 14 Nov 2023 15:28:05 +0100 Message-Id: <20231114142806.53894-5-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231114142806.53894-1-alassane.yattara@savoirfairelinux.com> References: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:22 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15524 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 Tue Nov 14 14:28:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alassane Yattara X-Patchwork-Id: 34460 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 45DD5C072A2 for ; Tue, 14 Nov 2023 14:28:22 +0000 (UTC) Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by mx.groups.io with SMTP id smtpd.web11.13791.1699972098243411641 for ; Tue, 14 Nov 2023 06:28:18 -0800 Authentication-Results: mx.groups.io; dkim=pass header.i=@savoirfairelinux.com header.s=DFC430D2-D198-11EC-948E-34200CB392D2 header.b=pUBHIKEz; 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 8D7A89C0760 for ; Tue, 14 Nov 2023 09:28:17 -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 yTeAclQ4yw-K; Tue, 14 Nov 2023 09:28:16 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 74CAE9C3552; Tue, 14 Nov 2023 09:28:16 -0500 (EST) DKIM-Filter: OpenDKIM Filter v2.10.3 mail.savoirfairelinux.com 74CAE9C3552 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=savoirfairelinux.com; s=DFC430D2-D198-11EC-948E-34200CB392D2; t=1699972096; bh=k8xUK/W/cCZzp+uGrQYcUx1+24rxNatPO2UsIeBji2o=; h=From:To:Date:Message-Id:MIME-Version; b=pUBHIKEz0TvJGyfTDFB6QUTlrLZ12fWbj6wyxTlGuIU1YTsn2gu0nnF+HzLSjqa9H 3JDfNivk2gBQ/dcIAOlhEUQPNhqK3hCw7V4tcn+c8qvujPp1JH/jd/D7BXyL+Tsc5R 9JblZ0vmW8TWtPBpfx5/1/0Qeye9pYEXlRptkj9l2CNEVftaFXA6PPZIFdM0wu2hpw XDpqtiHSSdA18ekKEuvSUQpFWQv4KaUApyYnYO6PbUaKM9jWLEmTdIM0AOVL1v0XBj hzVzzdPVB9vdfPOI/wsywRpQVnkDVlTJpGSX6btbPZzTAXRufN+X1TJlgk2eE0eDJv YD9IaJ1JiMl7g== 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 4npHGtSD_hx3; Tue, 14 Nov 2023 09:28:16 -0500 (EST) Received: from jedi.. (unknown [196.127.183.75]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 8501B9C2C19; Tue, 14 Nov 2023 09:28:15 -0500 (EST) From: Alassane Yattara To: bitbake-devel@lists.openembedded.org Cc: Alassane Yattara Subject: [PATCH v2 6/6] Toaster: Write UI TestCase -> Test "show rows" feature, change displaying rows in table Date: Tue, 14 Nov 2023 15:28:06 +0100 Message-Id: <20231114142806.53894-6-alassane.yattara@savoirfairelinux.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231114142806.53894-1-alassane.yattara@savoirfairelinux.com> References: <20231114142806.53894-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 ; Tue, 14 Nov 2023 14:28:22 -0000 X-Groupsio-URL: https://lists.openembedded.org/g/bitbake-devel/message/15525 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)