diff --git a/webtools/litmus/Litmus/DB/Testgroup.pm b/webtools/litmus/Litmus/DB/Testgroup.pm index ca72bf050d38..f46771dff3c0 100755 --- a/webtools/litmus/Litmus/DB/Testgroup.pm +++ b/webtools/litmus/Litmus/DB/Testgroup.pm @@ -38,6 +38,7 @@ use base 'Litmus::DBI'; Litmus::DB::Testgroup->table('testgroups'); Litmus::DB::Testgroup->columns(All => qw/testgroup_id product_id name enabled testrunner_plan_id/); +Litmus::DB::Testgroup->columns(Essential => qw/testgroup_id product_id name enabled testrunner_plan_id/); Litmus::DB::Testgroup->column_alias("product_id", "product"); @@ -49,18 +50,36 @@ __PACKAGE__->set_sql(EnabledByBranch => qq{ WHERE tgb.branch_id=? AND tgb.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC }); +__PACKAGE__->set_sql(ByBranch => qq{ + SELECT tg.* + FROM testgroups tg, testgroup_branches tgb + WHERE tgb.branch_id=? AND tgb.testgroup_id=tg.testgroup_id ORDER by tg.name ASC +}); + __PACKAGE__->set_sql(EnabledBySubgroup => qq{ SELECT tg.* FROM testgroups tg, subgroup_testgroups sgtg WHERE sgtg.subgroup_id=? AND sgtg.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC }); +__PACKAGE__->set_sql(BySubgroup => qq{ + SELECT tg.* + FROM testgroups tg, subgroup_testgroups sgtg + WHERE sgtg.subgroup_id=? AND sgtg.testgroup_id=tg.testgroup_id ORDER by tg.name ASC +}); + __PACKAGE__->set_sql(EnabledByTestcase => qq{ SELECT tg.* FROM testgroups tg, subgroup_testgroups sgtg, testcase_subgroups tcsg WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id AND tg.enabled=1 ORDER by tg.name ASC }); +__PACKAGE__->set_sql(ByTestcase => qq{ + SELECT tg.* + FROM testgroups tg, subgroup_testgroups sgtg, testcase_subgroups tcsg + WHERE tcsg.testcase_id=? AND tcsg.subgroup_id=sgtg.subgroup_id AND sgtg.testgroup_id=tg.testgroup_id ORDER by tg.name ASC +}); + ######################################################################### sub coverage { my $self = shift; @@ -98,6 +117,92 @@ sub coverage { return sprintf("%d",$total_percentage); } +######################################################################### +sub clone() { + my $self = shift; + + my $new_testgroup = $self->copy; + if (!$new_testgroup) { + return undef; + } + + # Propagate testgroup membership; + my $dbh = __PACKAGE__->db_Main(); + my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) SELECT subgroup_id,?,sort_order FROM subgroup_testgroups WHERE testgroup_id=?"; + + my $rows = $dbh->do($sql, + undef, + $new_testgroup->testgroup_id, + $self->testgroup_id + ); + if (! $rows) { + # XXX: Do we need to throw a warning here? + } + + return $new_testgroup; +} + +######################################################################### +sub delete_from_subgroups() { + my $self = shift; + + my $dbh = __PACKAGE__->db_Main(); + my $sql = "DELETE from subgroup_testgroups WHERE testgroup_id=?"; + my $rows = $dbh->do($sql, + undef, + $self->testgroup_id + ); +} + +######################################################################### +sub delete_from_test_runs() { + my $self = shift; + + # XXX: Placeholder for test runs. + return; +} + +######################################################################### +sub delete_with_refs() { + my $self = shift; + $self->delete_from_subgroups(); + $self->delete_from_test_runs(); + return $self->delete; +} + +######################################################################### +sub update_subgroups() { + my $self = shift; + my $new_subgroup_ids = shift; + + if (scalar @$new_subgroup_ids) { + # Failing to delete subgroups is _not_ fatal when adding a new testgroup. + my $rv = $self->delete_from_subgroups(); + my $dbh = __PACKAGE__->db_Main(); + my $sql = "INSERT INTO subgroup_testgroups (subgroup_id,testgroup_id,sort_order) VALUES (?,?,?)"; + my $sort_order = 1; + foreach my $new_subgroup_id (@$new_subgroup_ids) { + next if (!$new_subgroup_id); + # Log any failures/duplicate keys to STDERR. + eval { + my $rows = $dbh->do($sql, + undef, + $new_subgroup_id, + $self->testgroup_id, + $sort_order + ); + }; + if ($@) { + print STDERR $@; + } + $sort_order++; + } + } +} + +1; + + 1; diff --git a/webtools/litmus/Litmus/FormWidget.pm b/webtools/litmus/Litmus/FormWidget.pm index e7375cc76c2d..38a6df15ff22 100755 --- a/webtools/litmus/Litmus/FormWidget.pm +++ b/webtools/litmus/Litmus/FormWidget.pm @@ -169,13 +169,6 @@ sub getResultStatuses() return _getValues($sql); } -######################################################################### -sub getTestGroups() -{ - my $sql = "SELECT DISTINCT(name) FROM testgroups ORDER BY name"; - return _getValues($sql); -} - ######################################################################### sub getTestcaseIDs() { @@ -193,10 +186,18 @@ sub getTestcases() ######################################################################### sub getSubgroups() { - my $sql = "SELECT subgroup_id, name FROM subgroups ORDER BY name, subgroup_id"; + my $sql = "SELECT subgroup_id, name, product_id FROM subgroups ORDER BY name, subgroup_id"; return _getValues($sql); } +######################################################################### +sub getTestgroups() +{ + my $sql = "SELECT testgroup_id, name, product_id FROM testgroups ORDER BY name, testgroup_id"; + return _getValues($sql); +} + + ######################################################################### sub getLocales() { diff --git a/webtools/litmus/advanced_search.cgi b/webtools/litmus/advanced_search.cgi index 69965ca3bc43..a055754017e8 100755 --- a/webtools/litmus/advanced_search.cgi +++ b/webtools/litmus/advanced_search.cgi @@ -202,7 +202,7 @@ if ($c->param) { # Set a default value as appropriate. my $products = Litmus::FormWidget->getProducts; my $platforms = Litmus::FormWidget->getUniquePlatforms; -my $test_groups = Litmus::FormWidget->getTestGroups; +my $test_groups = Litmus::FormWidget->getTestgroups; my $testcases = Litmus::FormWidget->getTestcaseIDs; my $result_statuses = Litmus::FormWidget->getResultStatuses; my $branches = Litmus::FormWidget->getBranches; diff --git a/webtools/litmus/css/litmus.css b/webtools/litmus/css/litmus.css index 8f77a7d04d98..db50f3980ac8 100755 --- a/webtools/litmus/css/litmus.css +++ b/webtools/litmus/css/litmus.css @@ -939,11 +939,11 @@ table.manage input.button { margin: 5px; } -select.testcase-subgroups { +select.testcase-subgroups, select.subgroup-testgroups { width: 300px; } -select.testcase, select.subgroup { +select.testcase_id, select.subgroup_id, select.testgroup_id { width: 700px; } @@ -1130,7 +1130,7 @@ div.section-content { padding-right: 10px; } -div.testcase-content { +div.testcase-content, div.subgroup-content, div.testgroup-content { padding: 0px; margin: 5px 10px 0px 10px; width: auto; @@ -1213,3 +1213,28 @@ div.or { padding: 1em 0 1em 0; font-weight: bold; } + +table.testcase-search, table.test-runs { + border: 0; + margin: 0; + padding: 0; + background: inherit; + width: 100% +} + +table.testcase-search th, table.test-runs th { + vertical-align: middle; + font-weight: bold; + text-transform: lowercase; + text-align: left; + color: #666666; + padding: 0px 5px 0px 5px; + border: 0; +} + +div.testcase-search { + margin: 5px; + background-color: #efefef; + padding: 10px; + border: solid #bbbbbb 1px; +} diff --git a/webtools/litmus/index.cgi b/webtools/litmus/index.cgi index ee013a8ff29d..34381350f3a0 100755 --- a/webtools/litmus/index.cgi +++ b/webtools/litmus/index.cgi @@ -48,7 +48,7 @@ my ($criteria,$results) = Litmus::DB::Testresult->getDefaultTestResults; my $products = Litmus::FormWidget->getProducts(); my $platforms = Litmus::FormWidget->getUniquePlatforms(); -my $test_groups = Litmus::FormWidget->getTestGroups(); +my $test_groups = Litmus::FormWidget->getTestgroups(); my $result_statuses = Litmus::FormWidget->getResultStatuses; my $branches = Litmus::FormWidget->getBranches(); diff --git a/webtools/litmus/json.cgi b/webtools/litmus/json.cgi index 972115a0d3dd..eef36220e0fc 100755 --- a/webtools/litmus/json.cgi +++ b/webtools/litmus/json.cgi @@ -60,4 +60,16 @@ if ($c->param("testcase_id")) { my $json = JSON->new(skipinvalid => 1, convblessed => 1); my $js = $json->objToJson($subgroup); print $js; +} elsif ($c->param("testgroup_id")) { + my $testgroup_id = $c->param("testgroup_id"); + my $testgroup = Litmus::DB::Testgroup->retrieve($testgroup_id); + my @subgroups = Litmus::DB::Subgroup->search_EnabledByTestgroup($testgroup_id); + $testgroup->{'subgroups'} = \@subgroups; + my $json = JSON->new(skipinvalid => 1, convblessed => 1); + my $js = $json->objToJson($testgroup); + print $js; } + + + + diff --git a/webtools/litmus/search_results.cgi b/webtools/litmus/search_results.cgi index 0243afc9dcf6..753192246144 100755 --- a/webtools/litmus/search_results.cgi +++ b/webtools/litmus/search_results.cgi @@ -153,7 +153,7 @@ if ($c->param) { # Set a default value as appropriate. my $products = Litmus::FormWidget->getProducts; my $platforms = Litmus::FormWidget->getUniquePlatforms; -my $test_groups = Litmus::FormWidget->getTestGroups; +my $test_groups = Litmus::FormWidget->getTestgroups; my $result_statuses = Litmus::FormWidget->getResultStatuses; my $branches = Litmus::FormWidget->getBranches; my $locales = Litmus::FormWidget->getLocales; diff --git a/webtools/litmus/templates/en/default/admin/edit_testgroup.tmpl b/webtools/litmus/templates/en/default/admin/edit_testgroup.tmpl new file mode 100644 index 000000000000..00be12b43307 --- /dev/null +++ b/webtools/litmus/templates/en/default/admin/edit_testgroup.tmpl @@ -0,0 +1,136 @@ +[%# ***** BEGIN LICENSE BLOCK ***** + # Version: MPL 1.1 + # + # The contents of this file are subject to the Mozilla Public License Version + # 1.1 (the "License"); you may not use this file except in compliance with + # the License. You may obtain a copy of the License at + # http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS IS" basis, + # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + # for the specific language governing rights and limitations under the + # License. + # + # The Original Code is Litmus. + # + # The Initial Developer of the Original Code is + # The Mozilla Corporation. + # Portions created by the Initial Developer are Copyright (C) 2006 + # the Initial Developer. All Rights Reserved. + # + # Contributor(s): + # Chris Cooper + # Zach Lipton + # + # ***** END LICENSE BLOCK ***** +#%] + +[%# INTERFACE: + # $testgroup - the testgroup object to show +#%] + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Testgroup ID#:
Name:
Product:[% INCLUDE productbox onchange="changeProduct();populateAllSubgroups();" %]
Enabled? + + ⇐ Uncheck this to completely disable this testgroup.
Testrunner Plan ID#:

Manage Subgroups for this Testgroup
+
+ + + + + + + + + + + + + + + + + + +
All Subgroups For ProductSubgroups in Testgroup




⇑ Preview Subgroup⇑ Help with Managing Subgroups
+
+
  +
+ +
diff --git a/webtools/litmus/templates/en/default/admin/manage_subgroups.tmpl b/webtools/litmus/templates/en/default/admin/manage_subgroups.tmpl index 92abfcbc8ee6..57a86f1a0f33 100644 --- a/webtools/litmus/templates/en/default/admin/manage_subgroups.tmpl +++ b/webtools/litmus/templates/en/default/admin/manage_subgroups.tmpl @@ -54,6 +54,8 @@ function loadSubgroup() { if (! subgroup_select || subgroup_select.options[subgroup_select.selectedIndex].value=="") { disableModeButtons(); + document.getElementById('subgroup_display_div').style.display = 'none'; + document.getElementById('editform_div').style.display = 'none'; disableForm('edit_subgroup_form'); blankForm('edit_subgroup_form'); return false; @@ -63,9 +65,11 @@ function loadSubgroup() { disableForm('edit_subgroup_form'); var url = 'json.cgi?subgroup_id=' + subgroup_id; + toggleMessage('loading','Loading Subgroup ID# ' + subgroup_id + '...'); var d = loadJSONDoc(url); d.addBoth(function (res) { d.deferred = null; + toggleMessage('none'); return res; }); d.addCallback(populateSubgroup); @@ -85,12 +89,16 @@ function populateSubgroup(data) { document.getElementById('editform_subgroup_id').value = subgroup.subgroup_id; document.getElementById('editform_subgroup_id_display').innerHTML = subgroup.subgroup_id; document.getElementById('editform_name').value = subgroup.name; + document.getElementById('name_text').innerHTML = subgroup.name; + document.getElementById('subgroup_id_display').innerHTML = subgroup.subgroup_id; + var productBox = document.getElementById('product'); var options = productBox.getElementsByTagName('option'); var found_product = 0; for (var i=0; i -
-
Subgroup info
+ + +