diff --git a/storm.module b/storm.module index eda480b..296be8d 100644 --- a/storm.module +++ b/storm.module @@ -1090,27 +1090,21 @@ function storm_icon_delete_node($node, $params=array()) { function storm_icon_add($path, $item, $params=array()) { global $user; - $type = $item->type; - $af = $type .'_access'; - if (!$af('create', $item, $user)) return ''; + if (!node_access('create', $item, $user)) return ''; $attributes = array('class' => 'popups-form'); return storm_icon_l('application_add', $path, t('Add'), '', $params, $attributes); } function storm_icon_edit($path, $item, $params=array()) { global $user; - $type = $item->type; - $af = $type .'_access'; - if (!$af('update', $item, $user)) return ''; + if (!node_access('update', $item, $user)) return ''; $attributes = array('class' => 'popups-form'); return storm_icon_l('application_edit', $path, t('Edit'), '', $params, $attributes); } function storm_icon_delete($path, $item, $params=array()) { global $user; - $type = $item->type; - $af = $type .'_access'; - if (!$af('delete', $item, $user)) return ''; + if (!node_access('delete', $item, $user)) return ''; $attributes = array('class' => 'popups-form'); return storm_icon_l('application_delete', $path, t('Delete'), '', $params, $attributes); } diff --git a/storm_handler_field_operation.inc b/storm_handler_field_operation.inc index 8cd1859..ded363d 100644 --- a/storm_handler_field_operation.inc +++ b/storm_handler_field_operation.inc @@ -34,12 +34,14 @@ class storm_handler_field_operation extends views_handler_field_node_link { } function render($values) { + global $user; // ensure user has access to edit this node. $node = new stdClass(); $node->nid = $values->{$this->aliases['nid']}; $node->uid = $values->{$this->aliases['uid']}; $node->type = $values->{$this->aliases['type']}; $node->format = $values->{$this->aliases['format']}; + //TODO add stormorganization_nid and assigned_nid! $node->status = 1; // unpublished nodes ignore access control if ($this->options['display_icons']) { $value = ""; @@ -52,18 +54,14 @@ class storm_handler_field_operation extends views_handler_field_node_link { return $value; } else { - global $user; - $type = $node->type; - $af = $type .'_access'; - $value = ""; - if ($af('update', $node, $user)) { + if (node_access('update', $node)) { $value .= l(t('edit'), "node/$node->nid/edit", array('query' => drupal_get_destination())); } - if (!empty($value)) { - $value .= ' | '; - } - if ($af('delete', $node, $user)) { + if (node_access('delete', $node)) { + if (!empty($value)) { + $value .= ' | '; + } $value .= l(t('delete'), "node/$node->nid/delete", array('query' => drupal_get_destination())); } diff --git a/stormexpense/stormexpense.admin.inc b/stormexpense/stormexpense.admin.inc index 840fd63..67d0acf 100644 --- a/stormexpense/stormexpense.admin.inc +++ b/stormexpense/stormexpense.admin.inc @@ -86,8 +86,10 @@ function stormexpense_list() { ), ); - $s = "SELECT n.*, sex.* FROM {node} AS n INNER JOIN {stormexpense} AS sex ON n.vid=sex.vid - WHERE n.status=1 AND n.type='stormexpense' "; + $s = "SELECT n.*, sex.*, nre.format FROM {node} AS n + INNER JOIN {stormexpense} AS sex ON n.vid=sex.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormexpense' "; $s_totals = "SELECT SUM(amount) AS t_amount, SUM(tax1) AS t_tax1, SUM(tax2) AS t_tax2, SUM(total) AS t_total FROM {node} AS n INNER JOIN {stormexpense} AS sex ON n.vid=sex.vid WHERE n.status=1 AND n.type='stormexpense' "; diff --git a/stormexpense/stormexpense.test b/stormexpense/stormexpense.test index 9acda06..bb1d71e 100644 --- a/stormexpense/stormexpense.test +++ b/stormexpense/stormexpense.test @@ -14,7 +14,7 @@ class StormexpenseTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormexpense'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormexpense', 'stormperson'); } public function testStormexpenseAccess() { @@ -62,5 +62,130 @@ class StormexpenseTestCase extends DrupalWebTestCase { // Create a team $this->drupalGet('storm/expenses/report/std/en'); } + + public function testStormexpenseList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: access', 'Storm expense: add', 'Storm expense: view all', 'Storm expense: edit all', 'Storm expense: delete all', 'Storm person: add')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: access', 'Storm expense: add', 'Storm expense: view of user organization', 'Storm expense: edit of user organization', 'Storm expense: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: access', 'Storm expense: add', 'Storm expense: view own', 'Storm expense: edit own', 'Storm expense: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm expense: access', 'Storm expense: add', 'Storm expense: view all', 'Storm expense: edit own', 'Storm expense: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create expenses + $exp1 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + ); + $this->drupalPost('node/add/stormexpense', $exp1, t('Save')); + $exp1 = node_load(array('title' => $exp1['title'])); + + $this->drupalLogin($userOwn); + $exp2 = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormexpense', $exp2, t('Save')); + $exp2 = node_load(array('title' => $exp2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $exp3 = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org2->nid, + ); + $this->drupalPost('node/add/stormexpense', $exp3, t('Save')); + $exp3 = node_load(array('title' => $exp3['title'])); + + // Test for 'Storm expense: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/expenses'); + + $this->assertLink($exp1->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp1->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp1->nid.'/delete', 'The Expense edit icon appears on the list'); + + $this->assertLink($exp2->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/delete', 'The Expense edit icon appears on the list'); + + $this->assertLink($exp3->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp3->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp3->nid.'/delete', 'The Expense edit icon appears on the list'); + + // Test for 'Storm expense: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/expenses'); + + $this->assertLink($exp1->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp1->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp1->nid.'/delete', 'The Expense edit icon appears on the list'); + + $this->assertLink($exp2->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/delete', 'The Expense edit icon appears on the list'); + + $this->assertNoLink($exp3->title, 'The Expense appears not on the list'); + $this->assertNoRaw('node/'.$exp3->nid.'/edit', 'The Expense edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$exp3->nid.'/delete', 'The Expense edit icon does not appear on the list'); + + // Test for 'Storm expense: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/expenses'); + + $this->assertNoLink($exp1->title, 'The Expense appears not on the list'); + $this->assertNoRaw('node/'.$exp1->nid.'/edit', 'The Expense edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$exp1->nid.'/delete', 'The Expense edit icon does not appear on the list'); + + $this->assertLink($exp2->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp2->nid.'/delete', 'The Expense edit icon appears on the list'); + + $this->assertNoLink($exp3->title, 'The Expense appears not on the list'); + $this->assertNoRaw('node/'.$exp3->nid.'/edit', 'The Expense edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$exp3->nid.'/delete', 'The Expense edit icon does not appear on the list'); + + + // Test for 'Storm expense: view all', 'Storm expense: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/expenses'); + + $this->assertLink($exp1->title, 0, 'The Expense appears on the list'); + $this->assertNoRaw('node/'.$exp1->nid.'/edit', 'The Expense edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$exp1->nid.'/delete', 'The Expense edit icon does not appear on the list'); + + $this->assertLink($exp2->title, 0, 'The Expense appears on the list'); + $this->assertNoRaw('node/'.$exp2->nid.'/edit', 'The Expense edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$exp2->nid.'/delete', 'The Expense edit icon does not appear on the list'); + + $this->assertLink($exp3->title, 0, 'The Expense appears on the list'); + $this->assertRaw('node/'.$exp3->nid.'/edit', 'The Expense edit icon appears on the list'); + $this->assertRaw('node/'.$exp3->nid.'/delete', 'The Expense edit icon appears on the list'); + + } } diff --git a/stormexpense/stormexpense.theme.inc b/stormexpense/stormexpense.theme.inc index bf4b8a6..e935840 100644 --- a/stormexpense/stormexpense.theme.inc +++ b/stormexpense/stormexpense.theme.inc @@ -7,14 +7,6 @@ function theme_stormexpense_list($header, $expenses, $totals) { $rows = array(); foreach ($expenses as $expense) { - $n = new stdClass(); - $n->nid = $expense->nid; - $n->uid = $expense->uid; - $n->organization_nid = $expense->organization_nid; - $n->project_nid = $expense->project_nid; - $n->task_nid = $expense->task_nid; - $n->ticket_nid = $expense->ticket_nid; - $n->type = 'stormexpense'; $rows[] = array( l($expense->organization_title, 'node/'. $expense->organization_nid), l($expense->project_title, 'node/'. $expense->project_nid), @@ -22,7 +14,7 @@ function theme_stormexpense_list($header, $expenses, $totals) { format_date($expense->expensedate, 'custom', 'Y-m-d'), array('data' => sprintf('%.2f', $expense->total), 'align' => 'right'), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($expense, $_GET) .' '. storm_icon_delete_node($expense, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/storminvoice/storminvoice.admin.inc b/storminvoice/storminvoice.admin.inc index 4209f8d..d8fcf05 100644 --- a/storminvoice/storminvoice.admin.inc +++ b/storminvoice/storminvoice.admin.inc @@ -63,7 +63,10 @@ function storminvoice_list() { ), ); - $s = "SELECT n.title, sin.* FROM {node} AS n INNER JOIN {storminvoice} AS sin ON n.vid=sin.vid WHERE n.status=1 AND n.type='storminvoice' "; + $s = "SELECT n.title, n.type, n.uid, sin.*, nre.format FROM {node} AS n + INNER JOIN {storminvoice} AS sin ON n.vid=sin.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='storminvoice' "; $s_totals_topay = "SELECT SUM(amount) amount, SUM(tax1) tax1, SUM(tax2) tax2, SUM(total) total FROM {storminvoice} sin INNER JOIN {node} n ON n.vid=sin.vid WHERE n.status=1 AND n.type='storminvoice' AND sin.paymentdate=0"; diff --git a/storminvoice/storminvoice.test b/storminvoice/storminvoice.test index 9b13645..f0132e9 100644 --- a/storminvoice/storminvoice.test +++ b/storminvoice/storminvoice.test @@ -14,7 +14,7 @@ class StorminvoiceTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'storminvoice'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'storminvoice', 'stormperson'); } public function testStorminvoiceAccess() { @@ -55,6 +55,171 @@ class StorminvoiceTestCase extends DrupalWebTestCase { $this->drupalPost('node/add/stormorganization', $org, t('Save')); $this->drupalPost('node/add/storminvoice', $inv, t('Save')); - $this->assertText(t('Invoice @title has been created.', array('@title' => $inv['title'])));; + $this->assertText(t('Invoice @title has been created.', array('@title' => $inv['title']))); + } + + public function testStorminvoiceList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm invoice: access', 'Storm invoice: add', 'Storm invoice: view all', 'Storm invoice: edit all', 'Storm invoice: delete all', 'Storm person: add')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm invoice: access', 'Storm invoice: add', 'Storm invoice: view of user organization', 'Storm invoice: edit of user organization', 'Storm invoice: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm invoice: access', 'Storm invoice: add', 'Storm invoice: view own', 'Storm invoice: edit own', 'Storm invoice: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm invoice: access', 'Storm invoice: add', 'Storm invoice: view all', 'Storm invoice: edit own', 'Storm invoice: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create invoices + $inv1 = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + 'items_0_description' => $this->randomName(32), + 'items_0_amount' => '100.0', + 'items_0_tax1app' => '1', + 'items_0_tax1percent' => '20', + 'items_0_tax2app' => '2', + 'items_0_tax2percent' => '10', + ); + //tax1: 20; tax2: 12; total: 132 + $this->drupalPost('node/add/storminvoice', $inv1, t('Save')); + $inv1 = node_load(array('title' => $inv1['title'])); + + $this->drupalLogin($userOwn); + $inv2 = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + 'items_0_description' => $this->randomName(32), + 'items_0_amount' => '200', + 'items_0_tax1app' => '1', + 'items_0_tax1percent' => '20', + 'items_0_tax2app' => '0', + 'items_0_tax2percent' => '10', + ); + //tax1: 40; tax2: 0; total: 240 + $this->drupalPost('node/add/storminvoice', $inv2, t('Save')); + $inv2 = node_load(array('title' => $inv2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $inv3 = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org2->nid, + 'items_0_description' => $this->randomName(32), + 'items_0_amount' => '42,42', + 'items_0_tax1app' => '0', + 'items_0_tax1percent' => '5', + 'items_0_tax2app' => '0', + 'items_0_tax2percent' => '7.5', + ); + //tax1: 0, tax2: 0; total: 42.42 + $this->drupalPost('node/add/storminvoice', $inv3, t('Save')); + $inv3 = node_load(array('title' => $inv3['title'])); + + // Test for 'Storm invoice: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/invoices'); + + $this->assertLink($inv1->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv1->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv1->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertLink($inv2->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertLink($inv3->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv3->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv3->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertRaw('342.42', 'Total amount is correct.'); + $this->assertRaw('60.00', 'Total Tax1 is correct.'); + $this->assertRaw('12.00', 'Total Tax2 is correct.'); + $this->assertRaw('414.42', 'Total sum correct.'); + + // Test for 'Storm invoice: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/invoices'); + + $this->assertLink($inv1->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv1->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv1->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertLink($inv2->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertNoLink($inv3->title, 'The Invoice appears not on the list'); + $this->assertNoRaw('node/'.$inv3->nid.'/edit', 'The Invoice edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$inv3->nid.'/delete', 'The Invoice edit icon does not appear on the list'); + + $this->assertRaw('300.00', 'Total amount is correct.'); + $this->assertRaw('60.00', 'Total Tax1 is correct.'); + $this->assertRaw('12.00', 'Total Tax2 is correct.'); + $this->assertRaw('372.00', 'Total sum correct.'); + + // Test for 'Storm invoice: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/invoices'); + + $this->assertNoLink($inv1->title, 'The Invoice appears not on the list'); + $this->assertNoRaw('node/'.$inv1->nid.'/edit', 'The Invoice edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$inv1->nid.'/delete', 'The Invoice edit icon does not appear on the list'); + + $this->assertLink($inv2->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv2->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertNoLink($inv3->title, 'The Invoice appears not on the list'); + $this->assertNoRaw('node/'.$inv3->nid.'/edit', 'The Invoice edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$inv3->nid.'/delete', 'The Invoice edit icon does not appear on the list'); + + $this->assertRaw('200.00', 'Total amount is correct.'); + $this->assertRaw('40.00', 'Total Tax1 is correct.'); + $this->assertRaw('0.00', 'Total Tax2 is correct.'); + $this->assertRaw('240.00', 'Total sum correct.'); + + // Test for 'Storm invoice: view all', 'Storm invoice: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/invoices'); + + $this->assertLink($inv1->title, 0, 'The Invoice appears on the list'); + $this->assertNoRaw('node/'.$inv1->nid.'/edit', 'The Invoice edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$inv1->nid.'/delete', 'The Invoice edit icon does not appear on the list'); + + $this->assertLink($inv2->title, 0, 'The Invoice appears on the list'); + $this->assertNoRaw('node/'.$inv2->nid.'/edit', 'The Invoice edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$inv2->nid.'/delete', 'The Invoice edit icon does not appear on the list'); + + $this->assertLink($inv3->title, 0, 'The Invoice appears on the list'); + $this->assertRaw('node/'.$inv3->nid.'/edit', 'The Invoice edit icon appears on the list'); + $this->assertRaw('node/'.$inv3->nid.'/delete', 'The Invoice edit icon appears on the list'); + + $this->assertRaw('342.42', 'Total amount is correct.'); + $this->assertRaw('60.00', 'Total Tax1 is correct.'); + $this->assertRaw('12.00', 'Total Tax2 is correct.'); + $this->assertRaw('414.42', 'Total sum correct.'); + } } diff --git a/storminvoice/storminvoice.theme.inc b/storminvoice/storminvoice.theme.inc index 142c837..d330251 100644 --- a/storminvoice/storminvoice.theme.inc +++ b/storminvoice/storminvoice.theme.inc @@ -25,12 +25,6 @@ function theme_storminvoice_list($header, $invoices, $itemsperpage, $totals_topay, $totals_paid, $totals) { $rows = array(); foreach ($invoices as $invoice) { - $n = new stdClass(); - $n->nid = $invoice->nid; - $n->uid = $invoice->uid; - $n->organization_nid = $invoice->organization_nid; - $n->project_nid = $invoice->project_nid; - $n->type = 'storminvoice'; $invoice->status = 'open'; if ($invoice->paymentdate) { @@ -55,7 +49,7 @@ function theme_storminvoice_list($header, $invoices, $itemsperpage, $totals_topa format_date($invoice->requestdate, 'custom', 'Y-m-d'), array('data' => sprintf('%.2f', $invoice->total), 'align' => 'right'), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($invoice, $_GET) .' '. storm_icon_delete_node($invoice, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/stormnote/stormnote.admin.inc b/stormnote/stormnote.admin.inc index e6dfd9d..a16d6c7 100644 --- a/stormnote/stormnote.admin.inc +++ b/stormnote/stormnote.admin.inc @@ -68,7 +68,10 @@ function stormnote_list() { ), ); - $s = "SELECT n.title, sno.* FROM {node} AS n INNER JOIN {stormnote} AS sno ON n.vid=sno.vid WHERE n.status=1 AND n.type='stormnote' "; + $s = "SELECT n.title, n.type, n.uid, sno.*, nre.format FROM {node} AS n + INNER JOIN {stormnote} AS sno ON n.vid=sno.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormnote' "; $where = array(); $args = array(); diff --git a/stormnote/stormnote.test b/stormnote/stormnote.test index e650301..a514880 100644 --- a/stormnote/stormnote.test +++ b/stormnote/stormnote.test @@ -14,7 +14,7 @@ class StormnoteTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormnote'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormnote', 'stormperson'); } public function testStormnoteAccess() { @@ -61,4 +61,132 @@ class StormnoteTestCase extends DrupalWebTestCase { $this->assertText(t('Note @title has been created.', array('@title' => $note['title'])));; } + + public function testStormnoteList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm note: access', 'Storm note: add', 'Storm note: view all', 'Storm note: edit all', 'Storm note: delete all', 'Storm person: add')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm note: access', 'Storm note: add', 'Storm note: view of user organization', 'Storm note: edit of user organization', 'Storm note: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm note: access', 'Storm note: add', 'Storm note: view own', 'Storm note: edit own', 'Storm note: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm note: access', 'Storm note: add', 'Storm note: view all', 'Storm note: edit own', 'Storm note: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create notes + $note1 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormnote', $note1, t('Save')); + $note1 = node_load(array('title' => $note1['title'])); + + $this->drupalLogin($userOwn); + $note2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormnote', $note2, t('Save')); + $note2 = node_load(array('title' => $note2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $note3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + ); + $this->drupalPost('node/add/stormnote', $note3, t('Save')); + $note3 = node_load(array('title' => $note3['title'])); + + // Test for 'Storm note: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/notes'); + + $this->assertLink($note1->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note1->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note1->nid.'/delete', 'The Note delete icon appears on the list'); + + $this->assertLink($note2->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/delete', 'The Note delete icon appears on the list'); + + $this->assertLink($note3->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note3->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note3->nid.'/delete', 'The Note delete icon appears on the list'); + + // Test for 'Storm note: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/notes'); + + $this->assertLink($note1->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note1->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note1->nid.'/delete', 'The Note delete icon appears on the list'); + + $this->assertLink($note2->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/delete', 'The Note delete icon appears on the list'); + + $this->assertNoLink($note3->title, 'The Note appears not on the list'); + $this->assertNoRaw('node/'.$note3->nid.'/edit', 'The Note edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$note3->nid.'/delete', 'The Note delete icon appears not on the list'); + + // Test for 'Storm note: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/notes'); + + $this->assertNoLink($note1->title, 'The Note appears not on the list'); + $this->assertNoRaw('node/'.$note1->nid.'/edit', 'The Note edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$note1->nid.'/delete', 'The Note delete icon appears not on the list'); + + $this->assertLink($note2->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note2->nid.'/delete', 'The Note delete icon appears on the list'); + + $this->assertNoLink($note3->title, 'The Note appears not on the list'); + $this->assertNoRaw('node/'.$note3->nid.'/edit', 'The Note edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$note3->nid.'/delete', 'The Note delete icon appears not on the list'); + + + // Test for 'Storm note: view all', 'Storm note: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/notes'); + + $this->assertLink($note1->title, 0, 'The Note appears on the list'); + $this->assertNoRaw('node/'.$note1->nid.'/edit', 'The Note edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$note1->nid.'/delete', 'The Note edit icon does not appear on the list'); + + $this->assertLink($note2->title, 0, 'The Note appears on the list'); + $this->assertNoRaw('node/'.$note2->nid.'/edit', 'The Note edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$note2->nid.'/delete', 'The Note delete icon appears not on the list'); + + $this->assertLink($note3->title, 0, 'The Note appears on the list'); + $this->assertRaw('node/'.$note3->nid.'/edit', 'The Note edit icon appears on the list'); + $this->assertRaw('node/'.$note3->nid.'/delete', 'The Note delete icon appears on the list'); + + } } diff --git a/stormnote/stormnote.theme.inc b/stormnote/stormnote.theme.inc index 16a7285..d8723d5 100644 --- a/stormnote/stormnote.theme.inc +++ b/stormnote/stormnote.theme.inc @@ -8,20 +8,13 @@ function theme_stormnote_list($header, $notes) { $rows = array(); foreach ($notes as $note) { - $n = new stdClass(); - $n->nid = $note->nid; - $n->uid = $note->uid; - $n->organization_nid = $note->organization_nid; - $n->project_nid = $note->project_nid; - $n->task_nid = $note->task_nid; - $n->type = 'stormnote'; $rows[] = array( l($note->organization_title, 'node/'. $note->organization_nid), l($note->project_title, 'node/'. $note->project_nid), l($note->task_title, 'node/'. $note->task_nid), l($note->title, 'node/'. $note->nid), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($note, $_GET) .' '. storm_icon_delete_node($note, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/stormorganization/stormorganization.admin.inc b/stormorganization/stormorganization.admin.inc index 8bbcd0e..f6c05bb 100644 --- a/stormorganization/stormorganization.admin.inc +++ b/stormorganization/stormorganization.admin.inc @@ -35,7 +35,10 @@ function stormorganization_list() { ), ); - $s = "SELECT n.*, sor.* FROM {node} AS n INNER JOIN {stormorganization} AS sor ON n.vid=sor.vid WHERE n.status=1 AND n.type='stormorganization'"; + $s = "SELECT n.*, sor.*, nre.format FROM {node} AS n + INNER JOIN {stormorganization} AS sor ON n.vid=sor.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormorganization'"; $where = array(); $args = array(); diff --git a/stormorganization/stormorganization.test b/stormorganization/stormorganization.test index de55ed4..dd36797 100644 --- a/stormorganization/stormorganization.test +++ b/stormorganization/stormorganization.test @@ -14,7 +14,7 @@ class StormorganizationTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization'); + parent::setUp('storm', 'stormorganization', 'stormperson'); $privileged_user = $this->drupalCreateUser(array('Storm organization: add')); $this->drupalLogin($privileged_user); } @@ -43,4 +43,114 @@ class StormorganizationTestCase extends DrupalWebTestCase { $this->assertText(t('Organization @title has been created.', array('@title' => $edit['title']))); } + public function testStormorganizationList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: access', 'Storm organization: view all', 'Storm organization: edit all', 'Storm organization: delete all', 'Storm person: add')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: access', 'Storm organization: view belonged', 'Storm organization: edit belonged')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: access', 'Storm organization: view own', 'Storm organization: edit own', 'Storm organization: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: access', 'Storm organization: view all', 'Storm organization: edit own', 'Storm organization: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $organization1 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $organization1, t('Save')); + $organization1 = node_load(array('title' => $organization1['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $organization1->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create organization + $this->drupalLogin($userOwn); + $organization2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $organization2, t('Save')); + $organization2 = node_load(array('title' => $organization2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $organization3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $organization3, t('Save')); + $organization3 = node_load(array('title' => $organization3['title'])); + + // Test for 'Storm organization: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/organizations'); + + $this->assertLink($organization1->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization1->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertRaw('node/'.$organization1->nid.'/delete', 'The Organization edit icon appears on the list'); + + $this->assertLink($organization2->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization2->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertRaw('node/'.$organization2->nid.'/delete', 'The Organization edit icon appears on the list'); + + $this->assertLink($organization3->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization3->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertRaw('node/'.$organization3->nid.'/delete', 'The Organization edit icon appears on the list'); + + // Test for 'Storm organization: view belonged' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/organizations'); + + $this->assertLink($organization1->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization1->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertNoRaw('node/'.$organization1->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + $this->assertNoLink($organization2->title, 'The Organization appears on the list'); + $this->assertNoRaw('node/'.$organization2->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertNoRaw('node/'.$organization2->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + $this->assertNoLink($organization3->title, 'The Organization appears not on the list'); + $this->assertNoRaw('node/'.$organization3->nid.'/edit', 'The Organization edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$organization3->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + // Test for 'Storm organization: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/organizations'); + + $this->assertNoLink($organization1->title, 'The Organization appears not on the list'); + $this->assertNoRaw('node/'.$organization1->nid.'/edit', 'The Organization edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$organization1->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + $this->assertLink($organization2->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization2->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertRaw('node/'.$organization2->nid.'/delete', 'The Organization edit icon appears on the list'); + + $this->assertNoLink($organization3->title, 'The Organization appears not on the list'); + $this->assertNoRaw('node/'.$organization3->nid.'/edit', 'The Organization edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$organization3->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + + // Test for 'Storm organization: view all', 'Storm organization: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/organizations'); + + $this->assertLink($organization1->title, 0, 'The Organization appears on the list'); + $this->assertNoRaw('node/'.$organization1->nid.'/edit', 'The Organization edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$organization1->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + $this->assertLink($organization2->title, 0, 'The Organization appears on the list'); + $this->assertNoRaw('node/'.$organization2->nid.'/edit', 'The Organization edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$organization2->nid.'/delete', 'The Organization edit icon does not appear on the list'); + + $this->assertLink($organization3->title, 0, 'The Organization appears on the list'); + $this->assertRaw('node/'.$organization3->nid.'/edit', 'The Organization edit icon appears on the list'); + $this->assertRaw('node/'.$organization3->nid.'/delete', 'The Organization edit icon appears on the list'); + + } + } diff --git a/stormorganization/stormorganization.theme.inc b/stormorganization/stormorganization.theme.inc index 1dd3921..04633f0 100644 --- a/stormorganization/stormorganization.theme.inc +++ b/stormorganization/stormorganization.theme.inc @@ -10,16 +10,11 @@ function theme_stormorganization_list($header, $organizations) { $rows = array(); $countries = storm_attributes_bydomain('Country'); foreach ($organizations as $key => $organization) { - $n = new stdClass(); - $n->nid = $organization->nid; - $n->uid = $organization->uid; - $n->type = 'stormorganization'; - $rows[] = array( l($organization->title, 'node/'. $organization->nid), check_plain($countries['values'][$organization->country]), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($organization, $_GET) .' '. storm_icon_delete_node($organization, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/stormperson/stormperson.admin.inc b/stormperson/stormperson.admin.inc index a7822fa..0f11bd8 100644 --- a/stormperson/stormperson.admin.inc +++ b/stormperson/stormperson.admin.inc @@ -43,7 +43,10 @@ function stormperson_list() { $args = array(); $filterfields = array(); - $s = "SELECT n.*, spe.* FROM {node} AS n INNER JOIN {stormperson} AS spe ON n.vid=spe.vid WHERE n.status=1 AND n.type='stormperson' "; + $s = "SELECT n.*, spe.*, nre.format FROM {node} AS n + INNER JOIN {stormperson} AS spe ON n.vid=spe.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormperson' "; if (isset($_SESSION['stormperson_list_filter']['organization_nid']) && $_SESSION['stormperson_list_filter']['organization_nid'] != 0) { $where[] = 'spe.organization_nid=%d'; $args[] = $_SESSION['stormperson_list_filter']['organization_nid']; diff --git a/stormperson/stormperson.test b/stormperson/stormperson.test index b6c2032..8605242 100644 --- a/stormperson/stormperson.test +++ b/stormperson/stormperson.test @@ -48,4 +48,177 @@ class StormpersonTestCase extends DrupalWebTestCase { $this->drupalPost('node/add/stormperson', $person, t('Save')); $this->assertText(t('Person @title has been created.', array('@title' => $person['title']))); } + + public function testStormpersonList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm person: access', 'Storm person: add', 'Storm person: view all', 'Storm person: edit all', 'Storm person: delete all')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm person: access', 'Storm person: add', 'Storm person: view of user organization', 'Storm person: edit of user organization', 'Storm person: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm person: access', 'Storm person: add', 'Storm person: view own', 'Storm person: edit own', 'Storm person: delete own')); + $userLinked = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm person: access', 'Storm person: add', 'Storm person: view when linked to own user account', 'Storm person: edit when linked to own user account', 'Storm person: delete when linked to own user account')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm person: access', 'Storm person: add', 'Storm person: view all', 'Storm person: edit own', 'Storm person: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create persons + $person1 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormperson', $person1, t('Save')); + $person1 = node_load(array('title' => $person1['title'])); + + $person4 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'user_name' => $userLinked->name, + ); + $this->drupalPost('node/add/stormperson', $person4, t('Save')); + $person4 = node_load(array('title' => $person4['title'])); + + $this->drupalLogin($userOwn); + $person2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormperson', $person2, t('Save')); + $person2 = node_load(array('title' => $person2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $person3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + ); + $this->drupalPost('node/add/stormperson', $person3, t('Save')); + $person3 = node_load(array('title' => $person3['title'])); + + // Test for 'Storm person: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/people'); + + $this->assertLink($person1->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person1->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person1->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertLink($person2->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertLink($person3->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person3->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person3->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertLink($person4->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person4->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person4->nid.'/delete', 'The Person edit icon appears on the list'); + + // Test for 'Storm person: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/people'); + + $this->assertLink($person1->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person1->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person1->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertLink($person2->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertNoLink($person3->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertLink($person4->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person4->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person4->nid.'/delete', 'The Person edit icon appears on the list'); + + // Test for 'Storm person: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/people'); + + $this->assertNoLink($person1->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertLink($person2->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person2->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertNoLink($person3->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertNoLink($person4->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person4->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person4->nid.'/delete', 'The Person edit icon does not appear on the list'); + + // Test for 'Storm person: view all', 'Storm invoice: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/people'); + + $this->assertLink($person1->title, 0, 'The Person appears on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertLink($person2->title, 0, 'The Person appears on the list'); + $this->assertNoRaw('node/'.$person2->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person2->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertLink($person3->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person3->nid.'/edit', 'The Person edit icon appears on the list'); + $this->assertRaw('node/'.$person3->nid.'/delete', 'The Person edit icon appears on the list'); + + $this->assertLink($person4->title, 0, 'The Person appears on the list'); + $this->assertNoRaw('node/'.$person4->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person4->nid.'/delete', 'The Person edit icon does not appear on the list'); + + // Test for 'Storm person: view when linked to own user account' + $this->drupalLogin($userLinked); + $this->drupalGet('storm/people'); + + $this->assertNoLink($person1->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person1->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertNoLink($person2->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person2->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person2->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertNoLink($person3->title, 'The Person appears not on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$person3->nid.'/delete', 'The Person edit icon does not appear on the list'); + + $this->assertLink($person4->title, 0, 'The Person appears on the list'); + $this->assertRaw('node/'.$person4->nid.'/edit', 'The Person edit icon does not appear on the list'); + $this->assertRaw('node/'.$person4->nid.'/delete', 'The Person edit icon does not appear on the list'); + + } } diff --git a/stormperson/stormperson.theme.inc b/stormperson/stormperson.theme.inc index 185bf1b..2cdc03d 100644 --- a/stormperson/stormperson.theme.inc +++ b/stormperson/stormperson.theme.inc @@ -7,19 +7,12 @@ function theme_stormperson_list($header, $people) { $rows = array(); foreach ($people as $person) { - $n = new stdClass(); - $n->nid = $person->nid; - $n->uid = $person->uid; - $n->user_uid = $person->user_uid; - $n->organization_nid = $person->organization_nid; - $n->type = 'stormperson'; - $rows[] = array( l($person->organization_title, 'node/'. $person->organization_nid), l($person->title, 'node/'. $person->nid) . theme('mark', node_mark($person->nid, $person->changed)), l($person->email, 'mailto:'. $person->email), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($person, $_GET) .' '. storm_icon_delete_node($person, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/stormproject/stormproject.admin.inc b/stormproject/stormproject.admin.inc index 9be82d5..2569a9b 100644 --- a/stormproject/stormproject.admin.inc +++ b/stormproject/stormproject.admin.inc @@ -45,7 +45,10 @@ function stormproject_list() { ), ); - $s = "SELECT n.*, spr.* FROM {node} AS n INNER JOIN {stormproject} AS spr ON n.vid=spr.vid WHERE n.status=1 AND n.type='stormproject'"; + $s = "SELECT n.*, spr.*, nre.format FROM {node} AS n + INNER JOIN {stormproject} AS spr ON n.vid=spr.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormproject'"; $where = array(); $args = array(); diff --git a/stormproject/stormproject.module b/stormproject/stormproject.module index 021e8c6..20a54be 100644 --- a/stormproject/stormproject.module +++ b/stormproject/stormproject.module @@ -93,13 +93,13 @@ function stormproject_access($op, $node, $account=NULL) { elseif (user_access('Storm project: delete if project manager') && ($account->stormperson_nid == $node->manager_nid)) { return TRUE; } - elseif (user_access('Storm project: delete if assigned to project' && ($account->stormperson_nid == $node->assigned_nid))) { + elseif (user_access('Storm project: delete if assigned to project') && ($account->stormperson_nid == $node->assigned_nid)) { return TRUE; } - elseif (user_access('Storm project: delete if assigned to project' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid))) { + elseif (user_access('Storm project: delete if assigned to project') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid)) { return TRUE; } - elseif (user_access('Storm project: delete if assigned to project' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid))) { + elseif (user_access('Storm project: delete if assigned to project') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid)) { return TRUE; } } @@ -180,7 +180,7 @@ function stormproject_access_sql($sql, $where = array()) { if (module_exists('stormteam')) { // Load teams that the account belongs to - $belonged_teams = stormteam_user_return_teams($account); + $belonged_teams = stormteam_user_return_teams(); // Allow access if any of those teams is the one in question foreach ($belonged_teams as $belonged_team) { $cond .= ' OR spr.assigned_nid = '. $belonged_team; diff --git a/stormproject/stormproject.test b/stormproject/stormproject.test index b76da1d..7a6c869 100644 --- a/stormproject/stormproject.test +++ b/stormproject/stormproject.test @@ -14,7 +14,7 @@ class StormprojectTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormperson', 'stormteam'); } public function testStormprojectAccess() { @@ -51,4 +51,326 @@ class StormprojectTestCase extends DrupalWebTestCase { $this->assertText(t('Project @title has been created.', array('@title' => $prj['title'])));; } + + public function testStormprojectList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view all', 'Storm project: edit all', 'Storm project: delete all', 'Storm person: add', 'Storm team: add', 'Storm person: view all', 'Storm team: view all')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view of user organization', 'Storm project: edit of user organization', 'Storm project: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view own', 'Storm project: edit own', 'Storm project: delete own')); + $userManager = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view if project manager', 'Storm project: edit if project manager', 'Storm project: delete if project manager')); + $userAssigned = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view if assigned to project', 'Storm project: edit if assigned to project', 'Storm project: delete if assigned to project')); + $userAssignedTeam = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view if assigned to project', 'Storm project: edit if assigned to project', 'Storm project: delete if assigned to project')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm project: access', 'Storm project: add', 'Storm project: view all', 'Storm project: edit own', 'Storm project: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userManager->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $manager = node_load(array('title' => $personOrg['title'])); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssigned->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPerson = node_load(array('title' => $personOrg['title'])); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssignedTeam->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPersonTeam = node_load(array('title' => $personOrg['title'])); + + $team = array( + 'title' => $this->randomName(32), + 'members_array_1' => $assignedPersonTeam->nid, + ); + $this->drupalPost('node/add/stormteam', $team, t('Save')); + $team = node_load(array('title' => $team['title'])); + + // Create project + $project1 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormproject', $project1, t('Save')); + $project1 = node_load(array('title' => $project1['title'])); + + $projectManager = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'manager_nid' => $manager->nid, + ); + $this->drupalPost('node/add/stormproject', $projectManager, t('Save')); + $projectManager = node_load(array('title' => $projectManager['title'])); + + $projectAssigned = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $assignedPerson->nid, + ); + $this->drupalPost('node/add/stormproject', $projectAssigned, t('Save')); + $projectAssigned = node_load(array('title' => $projectAssigned['title'])); + + $projectAssignedTeam = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormproject', $projectAssignedTeam, t('Save')); + $projectAssignedTeam = node_load(array('title' => $projectAssignedTeam['title'])); + + $this->drupalLogin($userOwn); + $project2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormproject', $project2, t('Save')); + $project2 = node_load(array('title' => $project2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $project3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + ); + $this->drupalPost('node/add/stormproject', $project3, t('Save')); + $project3 = node_load(array('title' => $project3['title'])); + + // Test for 'Storm project: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/projects'); + + $this->assertLink($project1->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project1->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($project2->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($project3->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project3->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectManager->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectAssigned->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectAssignedTeam->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears on the list'); + + // Test for 'Storm project: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/projects'); + + $this->assertLink($project1->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project1->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($project2->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertNoLink($project3->title, 0, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectManager->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectAssigned->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectAssignedTeam->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears on the list'); + + // Test for 'Storm project: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/projects'); + + $this->assertNoLink($project1->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($project2->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertNoLink($project3->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectManager->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectAssigned->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectAssignedTeam->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears not on the list'); + + // Test for 'Storm project: view all', 'Storm project: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/projects'); + + $this->assertLink($project1->title, 0, 'The Project appears on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($project2->title, 0, 'The Project appears on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($project3->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$project3->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertLink($projectManager->title, 0, 'The Project appears on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectAssigned->title, 0, 'The Project appears on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectAssignedTeam->title, 0, 'The Project appears on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears not on the list'); + + // Test for 'Storm project: view if project manager' + $this->drupalLogin($userManager); + $this->drupalGet('storm/projects'); + + $this->assertNoLink($project1->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project2->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project3->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectManager->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertNoLink($projectAssigned->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectAssignedTeam->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears not on the list'); + + // Test for 'Storm project: view if assigned to project' + $this->drupalLogin($userAssigned); + $this->drupalGet('storm/projects'); + + $this->assertNoLink($project1->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project2->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project3->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectManager->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectAssigned->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears on the list'); + + $this->assertNoLink($projectAssignedTeam->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears not on the list'); + + // Test for 'Storm project: view if assigned to project' (using team) + $this->drupalLogin($userAssignedTeam); + $this->drupalGet('storm/projects'); + + $this->assertNoLink($project1->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project1->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project2->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project2->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($project3->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$project3->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectManager->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectManager->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertNoLink($projectAssigned->title, 'The Project appears not on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/edit', 'The Project edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$projectAssigned->nid.'/delete', 'The Project delete icon appears not on the list'); + + $this->assertLink($projectAssignedTeam->title, 0, 'The Project appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/edit', 'The Project edit icon appears on the list'); + $this->assertRaw('node/'.$projectAssignedTeam->nid.'/delete', 'The Project delete icon appears on the list'); + } } diff --git a/stormtask/stormtask.admin.inc b/stormtask/stormtask.admin.inc index 988d3d6..5a30720 100644 --- a/stormtask/stormtask.admin.inc +++ b/stormtask/stormtask.admin.inc @@ -483,7 +483,10 @@ function stormtask_list() { $args = array(); $filterfields = array(); - $s = "SELECT n.*, sta.* FROM {node} AS n INNER JOIN {stormtask} AS sta ON n.vid=sta.vid WHERE n.status=1 AND n.type='stormtask' "; + $s = "SELECT n.*, sta.*, nre.format FROM {node} AS n + INNER JOIN {stormtask} AS sta ON n.vid=sta.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormtask' "; if (isset($_SESSION['stormtask_list_filter']['organization_nid']) && ($_SESSION['stormtask_list_filter']['organization_nid'] != 0)) { $where[] = 'sta.organization_nid=%d'; $args[] = $_SESSION['stormtask_list_filter']['organization_nid']; diff --git a/stormtask/stormtask.module b/stormtask/stormtask.module index 6ac6fae..a7aecec 100644 --- a/stormtask/stormtask.module +++ b/stormtask/stormtask.module @@ -72,13 +72,13 @@ function stormtask_access($op, $node, $account=NULL) { elseif (user_access('Storm task: delete of user organization') && ($account->stormorganization_nid == $node->organization_nid)) { return TRUE; } - elseif (user_access('Storm task: delete if assigned to task' && ($account->stormperson_nid == $node->assigned_nid))) { + elseif (user_access('Storm task: delete if assigned to task') && ($account->stormperson_nid == $node->assigned_nid)) { return TRUE; } - elseif (user_access('Storm task: delete if assigned to task' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid))) { + elseif (user_access('Storm task: delete if assigned to task') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid)) { return TRUE; } - elseif (user_access('Storm task: delete if assigned to task' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid))) { + elseif (user_access('Storm task: delete if assigned to task') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid)) { return TRUE; } } diff --git a/stormtask/stormtask.test b/stormtask/stormtask.test index 5c977c2..9bb47c8 100644 --- a/stormtask/stormtask.test +++ b/stormtask/stormtask.test @@ -14,7 +14,7 @@ class StormtaskTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormperson', 'stormteam'); } public function testStormtaskAccess() { @@ -56,4 +56,283 @@ class StormtaskTestCase extends DrupalWebTestCase { $this->assertText(t('Task @title has been created.', array('@title' => $task['title'])));; } + + public function testStormtaskList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view all', 'Storm task: edit all', 'Storm task: delete all', 'Storm person: add', 'Storm team: add', 'Storm person: view all', 'Storm team: view all', 'Storm project: add', 'Storm project: view all')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view of user organization', 'Storm task: edit of user organization', 'Storm task: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view own', 'Storm task: edit own', 'Storm task: delete own', 'Storm project: view all')); + $userAssigned = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view if assigned to task', 'Storm task: edit if assigned to task', 'Storm task: delete if assigned to task')); + $userAssignedTeam = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view if assigned to task', 'Storm task: edit if assigned to task', 'Storm task: delete if assigned to task')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm task: access', 'Storm task: add', 'Storm task: view all', 'Storm task: edit own', 'Storm task: delete own', 'Storm project: view all')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssigned->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPerson = node_load(array('title' => $personOrg['title'])); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssignedTeam->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPersonTeam = node_load(array('title' => $personOrg['title'])); + + $team = array( + 'title' => $this->randomName(32), + 'members_array_1' => $assignedPersonTeam->nid, + ); + $this->drupalPost('node/add/stormteam', $team, t('Save')); + $team = node_load(array('title' => $team['title'])); + + // Create project foreach organization + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectOrg = node_load(array('title' => $prj['title'])); + + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectTeam = node_load(array('title' => $prj['title'])); + + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org2->nid, + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectOrg2 = node_load(array('title' => $prj['title'])); + + // Create tasks + $task1 = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormtask', $task1, t('Save'), array('query' => 'organization_nid='.$org->nid)); + $task1 = node_load(array('title' => $task1['title'])); + + $taskAssigned = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $assignedPerson->nid, + ); + $this->drupalPost('node/add/stormtask', $taskAssigned, t('Save'), array('query' => 'organization_nid='.$org->nid.'&project_nid='.$projectOrg->nid)); + $taskAssigned = node_load(array('title' => $taskAssigned['title'])); + + $taskAssignedTeam = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectTeam->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormtask', $taskAssignedTeam, t('Save'), array('query' => 'organization_nid='.$org->nid.'&project_nid='.$projectTeam->nid)); + $taskAssignedTeam = node_load(array('title' => $taskAssignedTeam['title'])); + + $this->drupalLogin($userOwn); + $task2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + ); + $this->drupalPost('node/add/stormtask', $task2, t('Save'), array('query' => 'organization_nid='.$org->nid)); + $task2 = node_load(array('title' => $task2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $task3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + 'project_nid' => $projectOrg2->nid, + ); + $this->drupalPost('node/add/stormtask', $task3, t('Save'), array('query' => 'organization_nid='.$org2->nid)); + $task3 = node_load(array('title' => $task3['title'])); + + // Test for 'Storm task: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/tasks'); + + $this->assertLink($task1->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task1->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task1->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($task2->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($task3->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task3->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($taskAssigned->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($taskAssignedTeam->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears on the list'); + + // Test for 'Storm task: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/tasks'); + + $this->assertLink($task1->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task1->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task1->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($task2->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertNoLink($task3->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($taskAssigned->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($taskAssignedTeam->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears on the list'); + + // Test for 'Storm task: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/tasks'); + + $this->assertNoLink($task1->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($task2->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertNoLink($task3->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($taskAssigned->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($taskAssignedTeam->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears not on the list'); + + // Test for 'Storm task: view all', 'Storm task: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/tasks'); + + $this->assertLink($task1->title, 0, 'The Task appears on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/delete', 'The Task edit icon does not appear on the list'); + + $this->assertLink($task2->title, 0, 'The Task appears on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($task3->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$task3->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertLink($taskAssigned->title, 0, 'The Task appears on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($taskAssignedTeam->title, 0, 'The Task appears on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears not on the list'); + + // Test for 'Storm task: view if assigned to task' + $this->drupalLogin($userAssigned); + $this->drupalGet('storm/tasks'); + + $this->assertNoLink($task1->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($task2->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($task3->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($taskAssigned->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears on the list'); + + $this->assertNoLink($taskAssignedTeam->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears not on the list'); + + // Test for 'Storm task: view if assigned to task' (using team) + $this->drupalLogin($userAssignedTeam); + $this->drupalGet('storm/tasks'); + + $this->assertNoLink($task1->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task1->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($task2->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task2->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($task3->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$task3->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertNoLink($taskAssigned->title, 'The Task appears not on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/edit', 'The Task edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$taskAssigned->nid.'/delete', 'The Task delete icon appears not on the list'); + + $this->assertLink($taskAssignedTeam->title, 0, 'The Task appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/edit', 'The Task edit icon appears on the list'); + $this->assertRaw('node/'.$taskAssignedTeam->nid.'/delete', 'The Task delete icon appears on the list'); + } } diff --git a/stormteam/stormteam.module b/stormteam/stormteam.module index b13c70e..f08a4d9 100644 --- a/stormteam/stormteam.module +++ b/stormteam/stormteam.module @@ -514,7 +514,9 @@ function stormteam_list() { ), ); - $s = "SELECT DISTINCT(n.nid), n.title, n.type, nre.teaser FROM {node} AS n INNER JOIN {stormteam} as ste ON n.vid=ste.vid INNER JOIN {node_revisions} as nre ON n.vid = nre.vid + $s = "SELECT n.nid, n.title, n.type, nre.teaser, nre.format, n.uid FROM {node} AS n + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + LEFT JOIN {stormteam} AS ste ON n.vid = ste.vid WHERE n.status=1 AND n.type='stormteam'"; $where = array(); diff --git a/stormteam/stormteam.test b/stormteam/stormteam.test index 56aac54..6b207d3 100644 --- a/stormteam/stormteam.test +++ b/stormteam/stormteam.test @@ -31,4 +31,127 @@ class StormteamTestCase extends DrupalWebTestCase { $this->assertText(t('Team @title has been created.', array('@title' => $team['title'])));; } + + public function testStormteamList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm team: access', 'Storm team: add', 'Storm team: view all', 'Storm team: edit all', 'Storm team: delete all', 'Storm person: add', 'Storm person: view all')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm team: access', 'Storm team: add', 'Storm team: view belonged', 'Storm team: edit belonged', 'Storm team: delete belonged')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm team: access', 'Storm team: add', 'Storm team: view own', 'Storm team: edit own', 'Storm team: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm team: access', 'Storm team: add', 'Storm team: view all', 'Storm team: edit own', 'Storm team: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $person = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $person, t('Save')); + $person = node_load(array('title' => $person['title'])); + + // Create teams + $team1 = array( + 'title' => $this->randomName(32), + 'members_array_1' => $person->nid, + ); + $this->drupalPost('node/add/stormteam', $team1, t('Save')); + $team1 = node_load(array('title' => $team1['title'])); + + $this->drupalLogin($userOwn); + $team2 = array( + 'title' => $this->randomName(32), + ); + $this->drupalPost('node/add/stormteam', $team2, t('Save')); + $team2 = node_load(array('title' => $team2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $team3 = array( + 'title' => $this->randomName(32), + ); + $this->drupalPost('node/add/stormteam', $team3, t('Save')); + $team3 = node_load(array('title' => $team3['title'])); + + // Test for 'Storm team: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/teams'); + + $this->assertLink($team1->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team1->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team1->nid.'/delete', 'The Team delete icon appears on the list'); + + $this->assertLink($team2->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team2->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team2->nid.'/delete', 'The Team delete icon appears on the list'); + + $this->assertLink($team3->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team3->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team3->nid.'/delete', 'The Team delete icon appears on the list'); + + // Test for 'Storm team: view belonged' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/teams'); + + $this->assertLink($team1->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team1->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team1->nid.'/delete', 'The Team delete icon appears on the list'); + + $this->assertNoLink($team2->title, 'The Team appears not on the list'); + $this->assertNoRaw('node/'.$team2->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team2->nid.'/delete', 'The Team delete icon appears not on the list'); + + $this->assertNoLink($team3->title, 'The Team appears not on the list'); + $this->assertNoRaw('node/'.$team3->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team3->nid.'/delete', 'The Team delete icon appears not on the list'); + + // Test for 'Storm team: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/teams'); + + $this->assertNoLink($team1->title, 'The Team appears not on the list'); + $this->assertNoRaw('node/'.$team1->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team1->nid.'/delete', 'The Team delete icon appears not on the list'); + + $this->assertLink($team2->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team2->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team2->nid.'/delete', 'The Team delete icon appears on the list'); + + $this->assertNoLink($team3->title, 'The Team appears not on the list'); + $this->assertNoRaw('node/'.$team3->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team3->nid.'/delete', 'The Team delete icon appears not on the list'); + + + // Test for 'Storm team: view all', 'Storm team: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/teams'); + + $this->assertLink($team1->title, 0, 'The Team appears on the list'); + $this->assertNoRaw('node/'.$team1->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team1->nid.'/delete', 'The Team edit icon does not appear on the list'); + + $this->assertLink($team2->title, 0, 'The Team appears on the list'); + $this->assertNoRaw('node/'.$team2->nid.'/edit', 'The Team edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$team2->nid.'/delete', 'The Team delete icon appears not on the list'); + + $this->assertLink($team3->title, 0, 'The Team appears on the list'); + $this->assertRaw('node/'.$team3->nid.'/edit', 'The Team edit icon appears on the list'); + $this->assertRaw('node/'.$team3->nid.'/delete', 'The Team delete icon appears on the list'); + + } } diff --git a/stormticket/stormticket.admin.inc b/stormticket/stormticket.admin.inc index 01fac07..6c30d11 100644 --- a/stormticket/stormticket.admin.inc +++ b/stormticket/stormticket.admin.inc @@ -82,7 +82,10 @@ function stormticket_list() { $args = array(); $filterfields = array(); - $s = "SELECT n.*, sti.* FROM {node} AS n INNER JOIN {stormticket} AS sti ON n.vid=sti.vid WHERE n.status=1 AND n.type='stormticket' "; + $s = "SELECT n.*, sti.*, nre.format FROM {node} AS n + INNER JOIN {stormticket} AS sti ON n.vid=sti.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormticket' "; if (isset($_SESSION['stormticket_list_filter']['organization_nid']) && ($_SESSION['stormticket_list_filter']['organization_nid'] != 0)) { $where[] = 'sti.organization_nid=%d'; diff --git a/stormticket/stormticket.module b/stormticket/stormticket.module index d8c02de..f5c8f74 100644 --- a/stormticket/stormticket.module +++ b/stormticket/stormticket.module @@ -76,13 +76,13 @@ function stormticket_access($op, $node, $account=NULL) { elseif (user_access('Storm ticket: delete of user organization') && ($account->stormorganization_nid == $node->organization_nid)) { return TRUE; } - elseif (user_access('Storm ticket: delete if assigned to ticket' && ($account->stormperson_nid == $node->assigned_nid))) { + elseif (user_access('Storm ticket: delete if assigned to ticket') && ($account->stormperson_nid == $node->assigned_nid)) { return TRUE; } - elseif (user_access('Storm ticket: delete if assigned to ticket' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid))) { + elseif (user_access('Storm ticket: delete if assigned to ticket') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormperson_nid)) { return TRUE; } - elseif (user_access('Storm ticket: delete if assigned to ticket' && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid))) { + elseif (user_access('Storm ticket: delete if assigned to ticket') && module_exists('stormteam') && stormteam_user_belongs_to_team($node->assigned_nid, $account->stormorganization_nid)) { return TRUE; } } diff --git a/stormticket/stormticket.test b/stormticket/stormticket.test index 17d35c4..dee659b 100644 --- a/stormticket/stormticket.test +++ b/stormticket/stormticket.test @@ -14,7 +14,7 @@ class StormticketTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormperson', 'stormteam'); } public function testStormticketAccess() { @@ -61,4 +61,284 @@ class StormticketTestCase extends DrupalWebTestCase { $this->assertText(t('Ticket @title has been created.', array('@title' => $ticket['title'])));; } + + public function testStormticketList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view all', 'Storm ticket: edit all', 'Storm ticket: delete all', 'Storm person: add', 'Storm team: add', 'Storm person: view all', 'Storm team: view all', 'Storm project: add', 'Storm project: view all')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view of user organization', 'Storm ticket: edit of user organization', 'Storm ticket: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view own', 'Storm ticket: edit own', 'Storm ticket: delete own', 'Storm project: view all')); + $userAssigned = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view if assigned to ticket', 'Storm ticket: edit if assigned to ticket', 'Storm ticket: delete if assigned to ticket')); + $userAssignedTeam = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view if assigned to ticket', 'Storm ticket: edit if assigned to ticket', 'Storm ticket: delete if assigned to ticket')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm ticket: access', 'Storm ticket: add', 'Storm ticket: view all', 'Storm ticket: edit own', 'Storm ticket: delete own', 'Storm project: view all')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssigned->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPerson = node_load(array('title' => $personOrg['title'])); + + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userAssignedTeam->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + $assignedPersonTeam = node_load(array('title' => $personOrg['title'])); + + $team = array( + 'title' => $this->randomName(32), + 'members_array_1' => $assignedPersonTeam->nid, + ); + $this->drupalPost('node/add/stormteam', $team, t('Save')); + $team = node_load(array('title' => $team['title'])); + + // Create project foreach organization + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectOrg = node_load(array('title' => $prj['title'])); + + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org->nid, + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectTeam = node_load(array('title' => $prj['title'])); + + $prj = array( + 'title' => $this->randomName(32), + 'organization_nid' => $org2->nid, + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormproject', $prj, t('Save')); + $projectOrg2 = node_load(array('title' => $prj['title'])); + + // Create tickets + $ticket1 = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormticket', $ticket1, t('Save'), array('query' => 'organization_nid='.$org->nid)); + $ticket1 = node_load(array('title' => $ticket1['title'])); + + $ticketAssigned = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $assignedPerson->nid, + ); + $this->drupalPost('node/add/stormticket', $ticketAssigned, t('Save'), array('query' => 'organization_nid='.$org->nid.'&project_nid='.$projectOrg->nid)); + $ticketAssigned = node_load(array('title' => $ticketAssigned['title'])); + + $ticketAssignedTeam = array( + 'organization_nid' => $org->nid, + 'project_nid' => $projectTeam->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'assigned_nid' => $team->nid, + ); + $this->drupalPost('node/add/stormticket', $ticketAssignedTeam, t('Save'), array('query' => 'organization_nid='.$org->nid.'&project_nid='.$projectTeam->nid)); + $ticketAssignedTeam = node_load(array('title' => $ticketAssignedTeam['title'])); + + $this->drupalLogin($userOwn); + $ticket2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'project_nid' => $projectOrg->nid, + ); + $this->drupalPost('node/add/stormticket', $ticket2, t('Save'), array('query' => 'organization_nid='.$org->nid)); + $ticket2 = node_load(array('title' => $ticket2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $ticket3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + 'project_nid' => $projectOrg2->nid, + ); + $this->drupalPost('node/add/stormticket', $ticket3, t('Save'), array('query' => 'organization_nid='.$org2->nid)); + $ticket3 = node_load(array('title' => $ticket3['title'])); + + // Test for 'Storm ticket: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/tickets'); + + $this->assertLink($ticket1->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket1->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticket2->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticket3->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticketAssigned->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticketAssignedTeam->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears on the list'); + + // Test for 'Storm ticket: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/tickets'); + + $this->assertLink($ticket1->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket1->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticket2->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertNoLink($ticket3->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticketAssigned->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticketAssignedTeam->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears on the list'); + + // Test for 'Storm ticket: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/tickets'); + + $this->assertNoLink($ticket1->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticket2->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertNoLink($ticket3->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticketAssigned->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticketAssignedTeam->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + // Test for 'Storm ticket: view all', 'Storm ticket: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/tickets'); + + $this->assertLink($ticket1->title, 0, 'The Ticket appears on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/delete', 'The Ticket edit icon does not appear on the list'); + + $this->assertLink($ticket2->title, 0, 'The Ticket appears on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticket3->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertLink($ticketAssigned->title, 0, 'The Ticket appears on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticketAssignedTeam->title, 0, 'The Ticket appears on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + // Test for 'Storm ticket: view if assigned to ticket' + $this->drupalLogin($userAssigned); + $this->drupalGet('storm/tickets'); + + $this->assertNoLink($ticket1->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticket2->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticket3->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticketAssigned->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears on the list'); + + $this->assertNoLink($ticketAssignedTeam->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + // Test for 'Storm ticket: view if assigned to ticket' (using team) + $this->drupalLogin($userAssignedTeam); + $this->drupalGet('storm/tickets'); + + $this->assertNoLink($ticket1->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket1->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticket2->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket2->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticket3->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticket3->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertNoLink($ticketAssigned->title, 'The Ticket appears not on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/edit', 'The Ticket edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$ticketAssigned->nid.'/delete', 'The Ticket delete icon appears not on the list'); + + $this->assertLink($ticketAssignedTeam->title, 0, 'The Ticket appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/edit', 'The Ticket edit icon appears on the list'); + $this->assertRaw('node/'.$ticketAssignedTeam->nid.'/delete', 'The Ticket delete icon appears on the list'); + } } diff --git a/stormticket/stormticket.theme.inc b/stormticket/stormticket.theme.inc index 675eafb..e20b858 100644 --- a/stormticket/stormticket.theme.inc +++ b/stormticket/stormticket.theme.inc @@ -8,12 +8,6 @@ function theme_stormticket_list($header, $tickets) { $rows = array(); foreach ($tickets as $ticket) { - $n = new stdClass(); - $n->nid = $ticket->nid; - $n->uid = $ticket->uid; - $n->organization_nid = $ticket->organization_nid; - $n->type = 'stormticket'; - $rows[] = array( storm_icon('category_'. $ticket->ticketcategory, storm_attribute_value('Ticket category', $ticket->ticketcategory)), l($ticket->organization_title, 'node/'. $ticket->organization_nid), @@ -23,7 +17,7 @@ function theme_stormticket_list($header, $tickets) { storm_icon('status_'. $ticket->ticketstatus, storm_attribute_value('Ticket status', $ticket->ticketstatus)), storm_icon('priority_'. $ticket->ticketpriority, storm_attribute_value('Ticket priority', $ticket->ticketpriority)), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($ticket, $_GET) .' '. storm_icon_delete_node($ticket, $_GET), 'class' => 'storm_list_operations', ), ); diff --git a/stormtimetracking/stormtimetracking.admin.inc b/stormtimetracking/stormtimetracking.admin.inc index be46306..22fb0c3 100644 --- a/stormtimetracking/stormtimetracking.admin.inc +++ b/stormtimetracking/stormtimetracking.admin.inc @@ -86,8 +86,10 @@ function stormtimetracking_list() { ), ); - $s = "SELECT n.*, stt.* FROM {node} n INNER JOIN {stormtimetracking} stt ON n.vid=stt.vid - WHERE n.status=1 AND n.type='stormtimetracking' "; + $s = "SELECT n.*, stt.*, nre.format FROM {node} n + INNER JOIN {stormtimetracking} stt ON n.vid=stt.vid + INNER JOIN {node_revisions} AS nre ON n.vid = nre.vid + WHERE n.status=1 AND n.type='stormtimetracking' "; $s_duration = "SELECT SUM(billing_duration) FROM {stormtimetracking} stt INNER JOIN {node} n ON n.vid=stt.vid WHERE n.status=1 AND n.type='stormtimetracking' "; diff --git a/stormtimetracking/stormtimetracking.test b/stormtimetracking/stormtimetracking.test index f4378b4..d6ee378 100644 --- a/stormtimetracking/stormtimetracking.test +++ b/stormtimetracking/stormtimetracking.test @@ -14,7 +14,7 @@ class StormtimetrackingTestCase extends DrupalWebTestCase { } public function setUp() { - parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormtimetracking'); + parent::setUp('storm', 'stormorganization', 'stormproject', 'stormtask', 'stormticket', 'stormtimetracking', 'stormperson'); } public function testStormtimetrackingCreate() { @@ -51,4 +51,132 @@ class StormtimetrackingTestCase extends DrupalWebTestCase { $this->assertText(t('Timetracking @title has been created.', array('@title' => $timetracking['title'])));; } + + public function testStormtimetrackingList() { + // Create and login user + $userAll = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm timetracking: access', 'Storm timetracking: add', 'Storm timetracking: view all', 'Storm timetracking: edit all', 'Storm timetracking: delete all', 'Storm person: add')); + $userOrg = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm timetracking: access', 'Storm timetracking: add', 'Storm timetracking: view of user organization', 'Storm timetracking: edit of user organization', 'Storm timetracking: delete of user organization')); + $userOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm timetracking: access', 'Storm timetracking: add', 'Storm timetracking: view own', 'Storm timetracking: edit own', 'Storm timetracking: delete own')); + $userViewAllEditOwn = $this->drupalCreateUser(array('Storm organization: add', 'Storm organization: view all', 'Storm timetracking: access', 'Storm timetracking: add', 'Storm timetracking: view all', 'Storm timetracking: edit own', 'Storm timetracking: delete own')); + + $this->drupalLogin($userAll); + + // Create organization + $org = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org, t('Save')); + $org = node_load(array('title' => $org['title'])); + + // Create organization + $org2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormorganization', $org2, t('Save')); + $org2 = node_load(array('title' => $org2['title'])); + + // Create stormperson with organization to userOrg + $personOrg = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + 'user_name' => $userOrg->name, + ); + $this->drupalPost('node/add/stormperson', $personOrg, t('Save')); + + // Create timetrackings + $timetracking1 = array( + 'organization_nid' => $org->nid, + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + ); + $this->drupalPost('node/add/stormtimetracking', $timetracking1, t('Save')); + $timetracking1 = node_load(array('title' => $timetracking1['title'])); + + $this->drupalLogin($userOwn); + $timetracking2 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org->nid, + ); + $this->drupalPost('node/add/stormtimetracking', $timetracking2, t('Save')); + $timetracking2 = node_load(array('title' => $timetracking2['title'])); + + $this->drupalLogin($userViewAllEditOwn); + $timetracking3 = array( + 'title' => $this->randomName(32), + 'body' => $this->randomName(64), + 'organization_nid' => $org2->nid, + ); + $this->drupalPost('node/add/stormtimetracking', $timetracking3, t('Save')); + $timetracking3 = node_load(array('title' => $timetracking3['title'])); + + // Test for 'Storm timetracking: view all' + $this->drupalLogin($userAll); + $this->drupalGet('storm/timetrackings'); + + $this->assertLink($timetracking1->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking1->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking1->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + $this->assertLink($timetracking2->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + $this->assertLink($timetracking3->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking3->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking3->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + // Test for 'Storm timetracking: view of user organization' + $this->drupalLogin($userOrg); + $this->drupalGet('storm/timetrackings'); + + $this->assertLink($timetracking1->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking1->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking1->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + $this->assertLink($timetracking2->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + $this->assertNoLink($timetracking3->title, 'The Timetracking appears not on the list'); + $this->assertNoRaw('node/'.$timetracking3->nid.'/edit', 'The Timetracking edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$timetracking3->nid.'/delete', 'The Timetracking delete icon appears not on the list'); + + // Test for 'Storm timetracking: view own' + $this->drupalLogin($userOwn); + $this->drupalGet('storm/timetrackings'); + + $this->assertNoLink($timetracking1->title, 'The Timetracking appears not on the list'); + $this->assertNoRaw('node/'.$timetracking1->nid.'/edit', 'The Timetracking edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$timetracking1->nid.'/delete', 'The Timetracking delete icon appears not on the list'); + + $this->assertLink($timetracking2->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking2->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + $this->assertNoLink($timetracking3->title, 'The Timetracking appears not on the list'); + $this->assertNoRaw('node/'.$timetracking3->nid.'/edit', 'The Timetracking edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$timetracking3->nid.'/delete', 'The Timetracking delete icon appears not on the list'); + + + // Test for 'Storm timetracking: view all', 'Storm timetracking: edit own' + $this->drupalLogin($userViewAllEditOwn); + $this->drupalGet('storm/timetrackings'); + + $this->assertLink($timetracking1->title, 0, 'The Timetracking appears on the list'); + $this->assertNoRaw('node/'.$timetracking1->nid.'/edit', 'The Timetracking edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$timetracking1->nid.'/delete', 'The Timetracking edit icon does not appear on the list'); + + $this->assertLink($timetracking2->title, 0, 'The Timetracking appears on the list'); + $this->assertNoRaw('node/'.$timetracking2->nid.'/edit', 'The Timetracking edit icon does not appear on the list'); + $this->assertNoRaw('node/'.$timetracking2->nid.'/delete', 'The Timetracking delete icon appears not on the list'); + + $this->assertLink($timetracking3->title, 0, 'The Timetracking appears on the list'); + $this->assertRaw('node/'.$timetracking3->nid.'/edit', 'The Timetracking edit icon appears on the list'); + $this->assertRaw('node/'.$timetracking3->nid.'/delete', 'The Timetracking delete icon appears on the list'); + + } } diff --git a/stormtimetracking/stormtimetracking.theme.inc b/stormtimetracking/stormtimetracking.theme.inc index e60aa43..c1d3150 100644 --- a/stormtimetracking/stormtimetracking.theme.inc +++ b/stormtimetracking/stormtimetracking.theme.inc @@ -7,14 +7,6 @@ function theme_stormtimetracking_list($header, $timetrackings, $billing_duration) { $rows = array(); foreach ($timetrackings as $timetracking) { - $n = new stdClass(); - $n->nid = $timetracking->nid; - $n->uid = $timetracking->uid; - $n->organization_nid = $timetracking->organization_nid; - $n->project_nid = $timetracking->project_nid; - $n->task_nid = $timetracking->task_nid; - $n->ticket_nid = $timetracking->ticket_nid; - $n->type = 'stormtimetracking'; $rows[] = array( l($timetracking->organization_title, 'node/'. $timetracking->organization_nid), l($timetracking->project_title, 'node/'. $timetracking->project_nid), @@ -22,7 +14,7 @@ function theme_stormtimetracking_list($header, $timetrackings, $billing_duration format_date($timetracking->trackingdate, 'small'), array('data' => sprintf('%.2f', $timetracking->billing_duration), 'align' => 'right'), array( - 'data' => storm_icon_edit_node($n, $_GET) .' '. storm_icon_delete_node($n, $_GET), + 'data' => storm_icon_edit_node($timetracking, $_GET) .' '. storm_icon_delete_node($timetracking, $_GET), 'class' => 'storm_list_operations', ), );