Listing method update for Newsletters/Forms/Segments/Subscribers

- updated unit tests
This commit is contained in:
Jonathan Labreuille
2016-09-08 14:34:21 +02:00
parent d6eaa4ac8a
commit 0c5589a3e3
10 changed files with 123 additions and 86 deletions

View File

@ -456,20 +456,28 @@ const Listing = React.createClass({
sort_by: this.state.sort_by, sort_by: this.state.sort_by,
sort_order: this.state.sort_order sort_order: this.state.sort_order
} }
}).always(() => {
this.setState({ loading: false });
}).done((response) => { }).done((response) => {
this.setState({ this.setState({
items: response.items || [], items: response.data || [],
filters: response.filters || {}, filters: response.meta.filters || {},
groups: response.groups || [], groups: response.meta.groups || [],
count: response.count || 0, count: response.meta.count || 0
loading: false
}, () => { }, () => {
// if viewing an empty trash // if viewing an empty trash
if (this.state.group === 'trash' && response.count === 0) { if (this.state.group === 'trash' && response.meta.count === 0) {
// redirect to default group // redirect to default group
this.handleGroup('all'); this.handleGroup('all');
} }
}); });
}).fail(function(response) {
if (response.errors.length > 0) {
MailPoet.Notice.error(
response.errors.map(function(error) { return error.message; }),
{ scroll: true }
);
}
}); });
} }
}, },

View File

@ -32,8 +32,8 @@ class Forms extends APIEndpoint {
$listing_data = $listing->get(); $listing_data = $listing->get();
// fetch segments relations for each returned item $data = array();
foreach($listing_data['items'] as $key => $form) { foreach($listing_data['items'] as $form) {
$form = $form->asArray(); $form = $form->asArray();
$form['signups'] = StatisticsForms::getTotalSignups($form['id']); $form['signups'] = StatisticsForms::getTotalSignups($form['id']);
@ -43,10 +43,15 @@ class Forms extends APIEndpoint {
? $form['settings']['segments'] ? $form['settings']['segments']
: array() : array()
); );
$listing_data['items'][$key] = $form;
$data[] = $form;
} }
return $listing_data; return $this->successResponse($data, array(
'count' => $listing_data['count'],
'filters' => $listing_data['filters'],
'groups' => $listing_data['groups']
));
} }
function create() { function create() {

View File

@ -285,15 +285,14 @@ class Newsletters extends APIEndpoint {
} }
function listing($data = array()) { function listing($data = array()) {
$listing = new Listing\Handler( $listing = new Listing\Handler(
'\MailPoet\Models\Newsletter', '\MailPoet\Models\Newsletter',
$data $data
); );
$listing_data = $listing->get(); $listing_data = $listing->get();
$subscriber = Subscriber::getCurrentWPUser();
foreach($listing_data['items'] as $key => $newsletter) { $data = array();
foreach($listing_data['items'] as $newsletter) {
$queue = false; $queue = false;
if($newsletter->type === Newsletter::TYPE_STANDARD) { if($newsletter->type === Newsletter::TYPE_STANDARD) {
@ -325,14 +324,18 @@ class Newsletters extends APIEndpoint {
} }
// get preview url // get preview url
$subscriber = Subscriber::getCurrentWPUser();
$newsletter->preview_url = NewsletterUrl::getViewInBrowserUrl( $newsletter->preview_url = NewsletterUrl::getViewInBrowserUrl(
$newsletter, $subscriber, $queue, $preview = true); $newsletter, $subscriber, $queue, $preview = true);
// convert object to array $data[] = $newsletter->asArray();
$listing_data['items'][$key] = $newsletter->asArray();
} }
return $listing_data; return $this->successResponse($data, array(
'count' => $listing_data['count'],
'filters' => $listing_data['filters'],
'groups' => $listing_data['groups']
));
} }
function bulkAction($data = array()) { function bulkAction($data = array()) {

View File

@ -32,18 +32,22 @@ class Segments extends APIEndpoint {
$listing_data = $listing->get(); $listing_data = $listing->get();
// fetch segments relations for each returned item $data = array();
foreach($listing_data['items'] as $key => $segment) { foreach($listing_data['items'] as $segment) {
$segment->subscribers_url = admin_url( $segment->subscribers_url = admin_url(
'admin.php?page=mailpoet-subscribers#/filter[segment='.$segment->id.']' 'admin.php?page=mailpoet-subscribers#/filter[segment='.$segment->id.']'
); );
$listing_data['items'][$key] = $segment $data[] = $segment
->withSubscribersCount() ->withSubscribersCount()
->asArray(); ->asArray();
} }
return $listing_data; return $this->successResponse($data, array(
'count' => $listing_data['count'],
'filters' => $listing_data['filters'],
'groups' => $listing_data['groups']
));
} }
function save($data = array()) { function save($data = array()) {

View File

@ -41,14 +41,18 @@ class Subscribers extends APIEndpoint {
$listing_data = $listing->get(); $listing_data = $listing->get();
// fetch segments relations for each returned item $data = array();
foreach($listing_data['items'] as $key => $subscriber) { foreach($listing_data['items'] as $subscriber) {
$listing_data['items'][$key] = $subscriber $data[] = $subscriber
->withSubscriptions() ->withSubscriptions()
->asArray(); ->asArray();
} }
return $listing_data; return $this->successResponse($data, array(
'count' => $listing_data['count'],
'filters' => $listing_data['filters'],
'groups' => $listing_data['groups']
));
} }
function subscribe($data = array()) { function subscribe($data = array()) {

View File

@ -106,6 +106,7 @@ class Handler {
); );
} }
// get items and total count
if(method_exists($this->model_class, 'listingQuery')) { if(method_exists($this->model_class, 'listingQuery')) {
$custom_query = call_user_func_array( $custom_query = call_user_func_array(
array($this->model_class, 'listingQuery'), array($this->model_class, 'listingQuery'),
@ -135,7 +136,6 @@ class Handler {
->findMany(); ->findMany();
} }
return array( return array(
'count' => $count, 'count' => $count,
'filters' => $filters, 'filters' => $filters,

View File

@ -34,13 +34,17 @@ class FormsTest extends MailPoetTest {
function testItCanGetListingData() { function testItCanGetListingData() {
$router = new Forms(); $router = new Forms();
$response = $router->listing(); $response = $router->listing();
expect($response)->hasKey('filters');
expect($response)->hasKey('groups'); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['count'])->equals(3);
expect($response['items'])->count(3); expect($response->meta)->hasKey('filters');
expect($response['items'][0]['name'])->equals('Form 1'); expect($response->meta)->hasKey('groups');
expect($response['items'][1]['name'])->equals('Form 2'); expect($response->meta['count'])->equals(3);
expect($response['items'][2]['name'])->equals('Form 3');
expect($response->data)->count(3);
expect($response->data[0]['name'])->equals('Form 1');
expect($response->data[1]['name'])->equals('Form 2');
expect($response->data[2]['name'])->equals('Form 3');
} }
function testItCanCreateANewForm() { function testItCanCreateANewForm() {

View File

@ -220,25 +220,26 @@ class NewslettersTest extends MailPoetTest {
$router = new Newsletters(); $router = new Newsletters();
$response = $router->listing(); $response = $router->listing();
expect($response)->hasKey('filters'); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response)->hasKey('groups');
expect($response['count'])->equals(2); expect($response->meta)->hasKey('filters');
expect($response['items'])->count(2); expect($response->meta)->hasKey('groups');
expect($response->meta['count'])->equals(2);
expect($response['items'][0]['subject'])->equals('My Standard Newsletter'); expect($response->data)->count(2);
expect($response['items'][1]['subject'])->equals('My Post Notification'); expect($response->data[0]['subject'])->equals('My Standard Newsletter');
expect($response->data[1]['subject'])->equals('My Post Notification');
// 1st subscriber has 2 segments // 1st subscriber has 2 segments
expect($response['items'][0]['segments'])->count(2); expect($response->data[0]['segments'])->count(2);
expect($response['items'][0]['segments'][0]['id']) expect($response->data[0]['segments'][0]['id'])
->equals($segment_1->id); ->equals($segment_1->id);
expect($response['items'][0]['segments'][1]['id']) expect($response->data[0]['segments'][1]['id'])
->equals($segment_2->id); ->equals($segment_2->id);
// 2nd subscriber has 1 segment // 2nd subscriber has 1 segment
expect($response['items'][1]['segments'])->count(1); expect($response->data[1]['segments'])->count(1);
expect($response['items'][1]['segments'][0]['id']) expect($response->data[1]['segments'][0]['id'])
->equals($segment_2->id); ->equals($segment_2->id);
} }
@ -279,9 +280,11 @@ class NewslettersTest extends MailPoetTest {
) )
)); ));
expect($response->status)->equals(APIResponse::STATUS_OK);
// we should only get the standard newsletter // we should only get the standard newsletter
expect($response['count'])->equals(1); expect($response->meta['count'])->equals(1);
expect($response['items'][0]['subject'])->equals($this->newsletter->subject); expect($response->data[0]['subject'])->equals($this->newsletter->subject);
// filter by 2nd segment // filter by 2nd segment
$response = $router->listing(array( $response = $router->listing(array(
@ -290,8 +293,10 @@ class NewslettersTest extends MailPoetTest {
) )
)); ));
expect($response->status)->equals(APIResponse::STATUS_OK);
// we should have the 2 newsletters // we should have the 2 newsletters
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
} }
function testItCanLimitListing() { function testItCanLimitListing() {
@ -303,9 +308,11 @@ class NewslettersTest extends MailPoetTest {
'sort_order' => 'asc' 'sort_order' => 'asc'
)); ));
expect($response['count'])->equals(2); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['items'])->count(1);
expect($response['items'][0]['subject'])->equals( expect($response->meta['count'])->equals(2);
expect($response->data)->count(1);
expect($response->data[0]['subject'])->equals(
$this->post_notification->subject $this->post_notification->subject
); );
@ -317,9 +324,9 @@ class NewslettersTest extends MailPoetTest {
'sort_order' => 'asc' 'sort_order' => 'asc'
)); ));
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
expect($response['items'])->count(1); expect($response->data)->count(1);
expect($response['items'][0]['subject'])->equals( expect($response->data[0]['subject'])->equals(
$this->newsletter->subject $this->newsletter->subject
); );
} }

View File

@ -31,15 +31,17 @@ class SegmentsTest extends MailPoetTest {
function testItCanGetListingData() { function testItCanGetListingData() {
$router = new Segments(); $router = new Segments();
$response = $router->listing(); $response = $router->listing();
expect($response)->hasKey('filters');
expect($response)->hasKey('groups');
expect($response['count'])->equals(3); expect($response->status)->equals(APIResponse::STATUS_OK);
expect($response['items'])->count(3);
expect($response['items'][0]['name'])->equals($this->segment_1->name); expect($response->meta)->hasKey('filters');
expect($response['items'][1]['name'])->equals($this->segment_2->name); expect($response->meta)->hasKey('groups');
expect($response['items'][2]['name'])->equals($this->segment_3->name); expect($response->meta['count'])->equals(3);
expect($response->data)->count(3);
expect($response->data[0]['name'])->equals($this->segment_1->name);
expect($response->data[1]['name'])->equals($this->segment_2->name);
expect($response->data[2]['name'])->equals($this->segment_3->name);
} }
function testItCanSaveASegment() { function testItCanSaveASegment() {

View File

@ -155,7 +155,7 @@ class SubscribersTest extends MailPoetTest {
)); ));
// it should return all subscribers // it should return all subscribers
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
// filter by 1st segment // filter by 1st segment
$response = $router->listing(array( $response = $router->listing(array(
@ -164,8 +164,8 @@ class SubscribersTest extends MailPoetTest {
) )
)); ));
expect($response['count'])->equals(1); expect($response->meta['count'])->equals(1);
expect($response['items'][0]['email'])->equals($this->subscriber_2->email); expect($response->data[0]['email'])->equals($this->subscriber_2->email);
// filter by 2nd segment // filter by 2nd segment
$response = $router->listing(array( $response = $router->listing(array(
@ -174,8 +174,8 @@ class SubscribersTest extends MailPoetTest {
) )
)); ));
expect($response['count'])->equals(1); expect($response->meta['count'])->equals(1);
expect($response['items'][0]['email'])->equals($this->subscriber_2->email); expect($response->data[0]['email'])->equals($this->subscriber_2->email);
} }
function testItCanSearchListing() { function testItCanSearchListing() {
@ -191,29 +191,29 @@ class SubscribersTest extends MailPoetTest {
$response = $router->listing(array( $response = $router->listing(array(
'search' => '' 'search' => ''
)); ));
expect($response['count'])->equals(3); expect($response->meta['count'])->equals(3);
// search by email // search by email
$response = $router->listing(array( $response = $router->listing(array(
'search' => '.me' 'search' => '.me'
)); ));
expect($response['count'])->equals(1); expect($response->meta['count'])->equals(1);
expect($response['items'][0]['email'])->equals($new_subscriber->email); expect($response->data[0]['email'])->equals($new_subscriber->email);
// search by last name // search by last name
$response = $router->listing(array( $response = $router->listing(array(
'search' => 'doe' 'search' => 'doe'
)); ));
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
expect($response['items'][0]['email'])->equals($this->subscriber_1->email); expect($response->data[0]['email'])->equals($this->subscriber_1->email);
expect($response['items'][1]['email'])->equals($this->subscriber_2->email); expect($response->data[1]['email'])->equals($this->subscriber_2->email);
// search by first name // search by first name
$response = $router->listing(array( $response = $router->listing(array(
'search' => 'billy' 'search' => 'billy'
)); ));
expect($response['count'])->equals(1); expect($response->meta['count'])->equals(1);
expect($response['items'][0]['email'])->equals($new_subscriber->email); expect($response->data[0]['email'])->equals($new_subscriber->email);
} }
function testItCanGroupListing() { function testItCanGroupListing() {
@ -222,28 +222,28 @@ class SubscribersTest extends MailPoetTest {
$subscribed_group = $router->listing(array( $subscribed_group = $router->listing(array(
'group' => Subscriber::STATUS_SUBSCRIBED 'group' => Subscriber::STATUS_SUBSCRIBED
)); ));
expect($subscribed_group['count'])->equals(1); expect($subscribed_group->meta['count'])->equals(1);
expect($subscribed_group['items'][0]['email'])->equals( expect($subscribed_group->data[0]['email'])->equals(
$this->subscriber_2->email $this->subscriber_2->email
); );
$unsubscribed_group = $router->listing(array( $unsubscribed_group = $router->listing(array(
'group' => Subscriber::STATUS_UNSUBSCRIBED 'group' => Subscriber::STATUS_UNSUBSCRIBED
)); ));
expect($unsubscribed_group['count'])->equals(0); expect($unsubscribed_group->meta['count'])->equals(0);
$unconfirmed_group = $router->listing(array( $unconfirmed_group = $router->listing(array(
'group' => Subscriber::STATUS_UNCONFIRMED 'group' => Subscriber::STATUS_UNCONFIRMED
)); ));
expect($unconfirmed_group['count'])->equals(1); expect($unconfirmed_group->meta['count'])->equals(1);
expect($unconfirmed_group['items'][0]['email'])->equals( expect($unconfirmed_group->data[0]['email'])->equals(
$this->subscriber_1->email $this->subscriber_1->email
); );
$trashed_group = $router->listing(array( $trashed_group = $router->listing(array(
'group' => 'trash' 'group' => 'trash'
)); ));
expect($trashed_group['count'])->equals(0); expect($trashed_group->meta['count'])->equals(0);
// trash 1st subscriber // trash 1st subscriber
$this->subscriber_1->trash(); $this->subscriber_1->trash();
@ -251,8 +251,8 @@ class SubscribersTest extends MailPoetTest {
$trashed_group = $router->listing(array( $trashed_group = $router->listing(array(
'group' => 'trash' 'group' => 'trash'
)); ));
expect($trashed_group['count'])->equals(1); expect($trashed_group->meta['count'])->equals(1);
expect($trashed_group['items'][0]['email'])->equals( expect($trashed_group->data[0]['email'])->equals(
$this->subscriber_1->email $this->subscriber_1->email
); );
} }
@ -266,9 +266,9 @@ class SubscribersTest extends MailPoetTest {
'sort_order' => 'asc' 'sort_order' => 'asc'
)); ));
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
expect($response['items'])->count(1); expect($response->data)->count(1);
expect($response['items'][0]['email'])->equals( expect($response->data[0]['email'])->equals(
$this->subscriber_2->email $this->subscriber_2->email
); );
@ -280,9 +280,9 @@ class SubscribersTest extends MailPoetTest {
'sort_order' => 'asc' 'sort_order' => 'asc'
)); ));
expect($response['count'])->equals(2); expect($response->meta['count'])->equals(2);
expect($response['items'])->count(1); expect($response->data)->count(1);
expect($response['items'][0]['email'])->equals( expect($response->data[0]['email'])->equals(
$this->subscriber_1->email $this->subscriber_1->email
); );
} }