Compare commits

...

35 Commits

Author SHA1 Message Date
8dbfe82922 Bump version up to 0.0.14 2016-02-05 17:34:53 +02:00
7322f2151c Merge pull request #334 from mailpoet/unit_tests_update
Enables conditional bypassing of unit tests
2016-02-05 16:38:31 +02:00
c43d2f240d - Updates MailChimp test and .env.sample 2016-02-05 09:35:32 -05:00
bbcd267b6f - Updates .env.sample with available options for unit tests 2016-02-05 09:00:28 -05:00
bbc4acb2a4 Merge pull request #335 from mailpoet/mailer_class_Fix
Fixes detection of reply_to address
2016-02-05 12:52:39 +02:00
c89cc5a919 Merge pull request #333 from mailpoet/test_email_fix
Test email fix
2016-02-05 12:19:40 +02:00
33075940de - Fixes detection of reply_to address 2016-02-04 19:22:11 -05:00
51c09b8360 Merge pull request #325 from mailpoet/router_unit_tests
Unit tests (Router\NewsletterTemplates & Router\Segments)
2016-02-04 18:59:09 -05:00
2fbf85f371 - Catches exception returned by mailer class when sender is not configured 2016-02-04 18:57:07 -05:00
24cb614adb - Enables conditional bypassing of unit tests 2016-02-04 18:41:18 -05:00
55f851208b Major update of unit tests / updated routers + models + react 2016-02-04 19:04:52 +01:00
990dac7727 Merge pull request #332 from mailpoet/editor_fixes
Editor bug fixes
2016-02-04 09:02:21 -05:00
233020ca20 fix unit tests 2016-02-04 14:38:25 +01:00
0c419cde16 Unit tests (Router\NewsletterTemplates & Router\Segments
- moved json_decode(body) inside NewsletterTemplate->asArray (override)
- updated NewsletterTemplate router accordingly
- finished Segments unit test
2016-02-04 14:36:08 +01:00
35f9530d8e Merge pull request #326 from mailpoet/router_unit_tests_2
More Unit Tests + Initializer fix
2016-02-04 08:24:15 -05:00
992fe2a6e9 Fix preventing dragging by settings/delete block tools 2016-02-04 13:47:46 +02:00
c2cb88f995 Unit tests fixed + models & routers update 2016-02-04 11:41:05 +01:00
ba69d659ab Changed editor to not send 'last_modified', let server pick one 2016-02-03 18:21:30 +02:00
397d988eb1 Allow block dragging only with "Move" tool, but not with others 2016-02-03 18:21:30 +02:00
d85f2341ec Change Posts/ALC to use MailPoet specific image size 2016-02-03 18:21:30 +02:00
2b3c288b5f Merge pull request #330 from mailpoet/template_footer_fix
Removes footer text/link color overrides for coffee shop template
2016-02-03 11:19:43 -05:00
8ec28a23a7 Removes footer text/link color overrides for coffee shop template 2016-02-03 15:04:18 +02:00
12c9623e2f Better Error handling for models
- added (array)getErrors() to models, returns false if no errors
- converted Forms::saveEditor method to use getErrors
- added error handling on the form editor view
2016-02-03 12:23:42 +01:00
8ba9fdccbc fix for initializer - widget is now registered 2016-02-03 10:42:56 +01:00
a2ef62302f More Unit Tests + Initializer fix
- added unit test for Router\Forms
- updated unit test for Model\Segment to reflect changes
2016-02-02 17:22:11 +01:00
24ecc879d3 Merge pull request #319 from mailpoet/php53-fix
Updates code to work with PHP 5.3
2016-02-02 13:25:23 +01:00
a1104a7f90 Merge pull request #320 from mailpoet/sending_queue_worker_fix
Sending queue worker fix
2016-02-01 16:32:42 +02:00
aa959810e9 Merge pull request #322 from mailpoet/code_coverage
Code coverage report
2016-02-01 16:31:53 +02:00
45b7a79277 Merge pull request #321 from mailpoet/router_upgrade_3
Router upgrade 3
2016-02-01 15:41:13 +02:00
41c8c0dae5 Code coverage report 2016-02-01 14:07:54 +01:00
2aeab7aaff Router Upgrade #3 & bugfix on Cron/Supervisor
- ALC
- Cron
- ImportExport
- Mailer
- Newsletters (only get method for consistency with other router get methods)
- Permissions
2016-02-01 13:00:11 +01:00
4fd0c4b484 Router updates + unit tests + React
- added -f flag to run unit test command in order to fail fast
- pass only id to "$endpoint->get($id)" in React forms instead of array
- updated routers according to the ->get($id) change
- refactored a bit the way form creation works
- added unit tests for Segments router
2016-02-01 11:56:21 +01:00
d4623cf763 Router update for Settings and Setup + unit tests 2016-02-01 11:56:21 +01:00
181c4fed08 - Fixes an issues with the sending queue worker throwing and error when
newsletter is not found
2016-01-31 21:35:34 -05:00
7884dd8389 - Updates code to work with PHP 5.3. Closes #307 2016-01-31 14:02:57 -05:00
69 changed files with 1381 additions and 770 deletions

View File

@ -1,2 +1,16 @@
WP_TEST_PATH="/var/www/wordpress"
WP_TEST_ENABLE_NETWORK_TESTS="true"
WP_TEST_IMPORT_MAILCHIMP_API=""
WP_TEST_IMPORT_MAILCHIMP_LISTS="" // (separated with comma)
WP_TEST_MAILER_ENABLE_SENDING="true"
WP_TEST_MAILER_AMAZON_ACCESS=""
WP_TEST_MAILER_AMAZON_SECRET=""
WP_TEST_MAILER_AMAZON_REGION=""
WP_TEST_MAILER_ELASTICEMAIL_API=""
WP_TEST_MAILER_MAILGUN_API=""
WP_TEST_MAILER_MAILGUN_DOMAIN=""
WP_TEST_MAILER_MAILPOET_API=""
WP_TEST_MAILER_SENDGRID_API=""
WP_TEST_MAILER_SMTP_HOST=""
WP_TEST_MAILER_SMTP_LOGIN=""
WP_TEST_MAILER_SMTP_PASSWORD=""

View File

@ -105,7 +105,17 @@ class RoboFile extends \Robo\Tasks {
function testUnit($file = null) {
$this->loadEnv();
$this->_exec('vendor/bin/codecept build');
$this->_exec('vendor/bin/codecept run unit '.(($file) ? $file : ''));
$this->_exec('vendor/bin/codecept run unit -f '.(($file) ? $file : ''));
}
function testCoverage() {
$this->loadEnv();
$this->_exec('vendor/bin/codecept build');
$this->_exec(join(' ', array(
'vendor/bin/codecept run',
'--coverage',
'--coverage-html'
)));
}
function testJavascript() {

View File

@ -48,7 +48,7 @@ define(
MailPoet.Ajax.post({
endpoint: this.props.endpoint,
action: 'get',
data: { id: id }
data: id
}).done(function(response) {
if(response === false) {
this.setState({

View File

@ -125,8 +125,8 @@ const FormList = React.createClass({
endpoint: 'forms',
action: 'create'
}).done(function(response) {
if(response !== false) {
window.location = response;
if(response.result && response.form_id) {
window.location = mailpoet_form_edit_url + response.form_id;
}
});
},

View File

@ -11,7 +11,7 @@ define([
// Does not hold newsletter content nor newsletter styles, those are
// handled by other components.
Module.NewsletterModel = SuperModel.extend({
stale: ['body'],
stale: ['body', 'created_at', 'deleted_at', 'updated_at'],
initialize: function(options) {
this.on('change', function() {
App.getChannel().trigger('autoSave');

View File

@ -29,7 +29,7 @@ define(
action: 'save',
data: template
}).done(function(response) {
if(response === true) {
if(response.result === true) {
this.props.onImport(template);
} else {
response.map(function(error) {

View File

@ -29,12 +29,14 @@ define(
subject: 'Draft newsletter',
}
}).done(function(response) {
if(response.id !== undefined) {
this.history.pushState(null, `/template/${response.id}`);
if(response.result && response.newsletter.id) {
this.history.pushState(null, `/template/${response.newsletter.id}`);
} else {
response.map(function(error) {
MailPoet.Notice.error(error);
});
if(response.errors.length > 0) {
response.errors.map(function(error) {
MailPoet.Notice.error(error);
});
}
}
}.bind(this));
},

View File

@ -138,12 +138,14 @@ define(
options: this.state,
},
}).done(function(response) {
if(response.id !== undefined) {
this.showTemplateSelection(response.id);
if(response.result && response.newsletter.id) {
this.showTemplateSelection(response.newsletter.id);
} else {
response.map(function(error) {
MailPoet.Notice.error(error);
});
if(response.errors.length > 0) {
response.errors.map(function(error) {
MailPoet.Notice.error(error);
});
}
}
}.bind(this));
},

View File

@ -32,12 +32,15 @@ define(
type: 'standard',
}
}).done(function(response) {
if(response.id !== undefined) {
this.showTemplateSelection(response.id);
console.log(response);
if(response.result && response.newsletter.id) {
this.showTemplateSelection(response.newsletter.id);
} else {
response.map(function(error) {
MailPoet.Notice.error(error);
});
if(response.errors.length > 0) {
response.errors.map(function(error) {
MailPoet.Notice.error(error);
});
}
}
}.bind(this));
},

View File

@ -111,12 +111,14 @@ define(
options: this.state,
},
}).done(function(response) {
if(response.id !== undefined) {
this.showTemplateSelection(response.id);
if(response.result && response.newsletter.id) {
this.showTemplateSelection(response.newsletter.id);
} else {
response.map(function(error) {
MailPoet.Notice.error(error);
});
if(response.errors.length > 0) {
response.errors.map(function(error) {
MailPoet.Notice.error(error);
});
}
}
}.bind(this));
},

View File

@ -19,3 +19,12 @@ modules:
user: ''
password: ''
dump: tests/_data/dump.sql
coverage:
enabled: true
whitelist:
include:
- lib/*
exclude:
blacklist:
include:
exclude:

View File

@ -36,8 +36,9 @@ class Env {
self::$views_path = self::$path . '/views';
self::$assets_path = self::$path . '/assets';
self::$assets_url = plugins_url('/assets', $file);
self::$temp_path = wp_upload_dir()['path'];
self::$temp_URL = wp_upload_dir()['url'];
$wp_upload_dir = wp_upload_dir();
self::$temp_path = $wp_upload_dir['path'];
self::$temp_URL = $wp_upload_dir['url'];
self::$languages_path = self::$path . '/lang';
self::$lib_path = self::$path . '/lib';
self::$plugin_prefix = 'mailpoet_';
@ -72,19 +73,4 @@ class Env {
);
return implode('', $source_name);
}
static function isPluginActivated() {
$activatesPlugins = get_option('active_plugins');
$isActivated = (
in_array(
sprintf('%s/%s.php', basename(self::$path), self::$plugin_name),
$activatesPlugins
) ||
in_array(
sprintf('%s/%s.php', explode('/', plugin_basename(__FILE__))[0], self::$plugin_name),
$activatesPlugins
)
);
return ($isActivated) ? true : false;
}
}

View File

@ -9,6 +9,8 @@ use MailPoet\Settings\Pages;
if(!defined('ABSPATH')) exit;
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
class Initializer {
function __construct($params = array(
'file' => '',
@ -18,17 +20,25 @@ class Initializer {
}
function init() {
$this->setupDB();
register_activation_hook(Env::$file, array($this, 'runMigrator'));
register_activation_hook(Env::$file, array($this, 'runPopulator'));
add_action('init', array($this, 'setup'));
add_action('widgets_init', array($this, 'setupWidget'));
}
function setup() {
try {
$this->setupDB();
$this->setupRenderer();
$this->setupLocalizer();
$this->setupMenu();
$this->setupRouter();
$this->setupWidget();
$this->setupAnalytics();
$this->setupPermissions();
$this->setupChangelog();
$this->setupPublicAPI();
$this->setupAnalytics();
$this->setupChangelog();
$this->runQueueSupervisor();
$this->setupShortcodes();
$this->setupHooks();
@ -86,8 +96,12 @@ class Initializer {
define('MP_NEWSLETTER_STATISTICS_TABLE', $newsletter_statistics);
}
function runMigrator() {
$migrator = new Migrator();
$migrator->up();
}
function runPopulator() {
$this->init();
$populator = new Populator();
$populator->up();
}
@ -103,10 +117,7 @@ class Initializer {
}
function setupMenu() {
$menu = new Menu(
$this->renderer,
Env::$assets_url
);
$menu = new Menu($this->renderer, Env::$assets_url);
$menu->init();
}
@ -156,9 +167,7 @@ class Initializer {
}
function runQueueSupervisor() {
if(php_sapi_name() === 'cli' ||
!Env::isPluginActivated()
) return;
if(php_sapi_name() === 'cli') return;
try {
$supervisor = new Supervisor();
$supervisor->checkDaemon();

View File

@ -279,19 +279,19 @@ class FranksRoastHouseTemplate {
"blocks" => array(
array(
"type" => "footer",
"text" => __("<p><span style=\"color: #000000;\"><a href=\"[unsubscribeUrl]\" style=\"color: #000000;\">Unsubscribe</a> | <a href=\"[manageSubscriptionUrl]\" style=\"color: #000000;\">Manage subscription</a></span><br /><span style=\"color: #000000;\">12345 MailPoet Drive, EmailVille, 76543</span></p>"),
"text" => __("<p><a href=\"[unsubscribeUrl]\">Unsubscribe</a> | <a href=\"[manageSubscriptionUrl]\">Manage subscription</a><br />12345 MailPoet Drive, EmailVille, 76543</p>"),
"styles" => array(
"block" => array(
"backgroundColor" => "#a9a7a7"
),
"text" => array(
"fontColor" => "#ffffff",
"fontColor" => "#000000",
"fontFamily" => "Arial",
"fontSize" => "12px",
"textAlign" => "center"
),
"link" => array(
"fontColor" => "#ffffff",
"fontColor" => "#000000",
"textDecoration" => "underline"
)
)

View File

@ -9,13 +9,12 @@ class Widget {
}
function init() {
add_action('widgets_init', array($this, 'registerWidget'));
$this->registerWidget();
if(!is_admin()) {
//$this->setupActions();
add_action('widgets_init', array($this, 'setupDependencies'));
$this->setupDependencies();
} else {
add_action('widgets_init', array($this, 'setupAdminDependencies'));
$this->setupAdminDependencies();
}
}
@ -69,6 +68,9 @@ class Widget {
}
}
// TODO: extract this method into an Initializer
// - the "ajax" part might probably be useless
// - the "post" (non-ajax) part needs to be redone properly
function setupActions() {
// ajax requests
add_action(

View File

@ -62,7 +62,7 @@ class Supervisor {
list(, $message) = explode(':', $status[0]);
$message = base64_decode($message);
}
return $this->formatResult(
return $this->formatResultMessage(
false,
$message
);

View File

@ -21,11 +21,11 @@ class SendingQueue {
function process() {
// TODO: implement mailer sending frequency limits
foreach($this->getQueues() as $queue) {
$newsletter = Newsletter::findOne($queue->newsletter_id)
->asArray();
$newsletter = Newsletter::findOne($queue->newsletter_id);
if(!$newsletter) {
continue;
};
$newsletter = $newsletter->asArray();
$mailer = $this->configureMailerForNewsletter($newsletter);
$subscribers = json_decode($queue->subscribers, true);
$subscribers_to_process = $subscribers['to_process'];

View File

@ -65,6 +65,8 @@ class Widget extends \WP_Widget {
)
);
$form_edit_url = admin_url('admin.php?page=mailpoet-form-editor&id=');
// set title
$title = isset($instance['title']) ? strip_tags($instance['title']) : '';
@ -102,8 +104,9 @@ class Widget extends \WP_Widget {
endpoint: 'forms',
action: 'create'
}).done(function(response) {
if(response !== false) {
window.location = response;
if(response.result && response.form_id) {
window.location =
"<?php echo $form_edit_url; ?>" + response.form_id;
}
});
return false;

View File

@ -122,7 +122,7 @@ class Mailer {
}
}
if(!$reply_to['address']) {
$reply_to['reply_to_email'] = $this->sender['from_email'];
$reply_to['address'] = $this->sender['from_email'];
}
return array(
'reply_to_name' => $reply_to['name'],

View File

@ -20,10 +20,11 @@ class SendGrid {
$this->url,
$this->request($newsletter, $subscriber)
);
$result_body = json_decode($result['body'], true);
return (
!is_wp_error($result) === true &&
!preg_match('!invalid!', $result['body']) === true &&
!isset(json_decode($result['body'], true)['errors']) === true &&
!isset($result_body['errors']) === true &&
wp_remote_retrieve_response_code($result) === 200
);
}

View File

@ -19,20 +19,24 @@ class CustomField extends Model {
function asArray() {
$model = parent::asArray();
$model['params'] = (
is_serialized($this->params)
? unserialize($this->params)
: $this->params
);
if(isset($model['params'])) {
$model['params'] = (
is_array($this->params)
? $this->params
: unserialize($this->params)
);
}
return $model;
}
function save() {
if(is_null($this->params)) {
$this->params = array();
}
$this->set('params', (
is_serialized($this->params)
? $this->params
: serialize($this->params)
is_array($this->params)
? serialize($this->params)
: $this->params
));
return parent::save();
}
@ -66,12 +70,6 @@ class CustomField extends Model {
$custom_field->set($data);
}
try {
$custom_field->save();
return $custom_field;
} catch(Exception $e) {
return $custom_field->getValidationErrors();
}
return false;
return $custom_field->save();
}
}

View File

@ -4,7 +4,10 @@ namespace MailPoet\Models;
if(!defined('ABSPATH')) exit;
class Model extends \Sudzy\ValidModel {
protected $_errors;
function __construct() {
$this->_errors = array();
$customValidators = new CustomValidator();
parent::__construct($customValidators->init());
}
@ -13,16 +16,37 @@ class Model extends \Sudzy\ValidModel {
return parent::create();
}
function getErrors() {
if(empty($this->_errors)) {
return false;
} else {
return $this->_errors;
}
}
function setError($error = '') {
if(!empty($error)) {
if(is_array($error)) {
$this->_errors = array_merge($this->_errors, $error);
$this->_errors = array_unique($this->_errors);
} else {
$this->_errors[] = $error;
}
}
}
function save() {
$this->setTimestamp();
try {
parent::save();
return true;
} catch (\Sudzy\ValidationException $e) {
return array_unique($e->getValidationErrors());
} catch (\PDOException $e) {
return $e->getMessage();
} catch(\Sudzy\ValidationException $e) {
$this->setError($e->getValidationErrors());
} catch(\PDOException $e) {
$this->setError($e->getMessage());
} catch(\Exception $e) {
$this->setError($e->getMessage());
}
return $this;
}
function trash() {

View File

@ -8,6 +8,10 @@ class Newsletter extends Model {
function __construct() {
parent::__construct();
$this->addValidations('type', array(
'required' => __('You need to specify a type.')
));
}
function save() {
@ -15,9 +19,23 @@ class Newsletter extends Model {
$this->set_expr('deleted_at', 'NULL');
}
$this->set('body',
is_array($this->body)
? json_encode($this->body)
: $this->body
);
return parent::save();
}
function asArray() {
$model = parent::asArray();
if(isset($model['body'])) {
$model['body'] = json_decode($model['body'], true);
}
return $model;
}
function delete() {
// delete all relations to segments
NewsletterSegment::where('newsletter_id', $this->id)->deleteMany();

View File

@ -17,6 +17,14 @@ class NewsletterTemplate extends Model {
));
}
function asArray() {
$template = parent::asArray();
if(isset($template['body'])) {
$template['body'] = json_decode($template['body'], true);
}
return $template;
}
static function createOrUpdate($data = array()) {
$template = false;
@ -32,16 +40,7 @@ class NewsletterTemplate extends Model {
$template->set($data);
}
$saved = $template->save();
if($saved === true) {
return true;
} else {
$errors = $template->getValidationErrors();
if(!empty($errors)) {
return $errors;
}
}
return false;
$template->save();
return $template;
}
}

View File

@ -164,8 +164,7 @@ class Segment extends Model {
$segment->set($data);
}
$segment->save();
return $segment;
return $segment->save();
}
static function getPublic() {

View File

@ -10,8 +10,7 @@ class Setting extends Model {
parent::__construct();
$this->addValidations('name', array(
'required' => 'name_is_blank',
'isString' => 'name_is_not_string'
'required' => __('You need to specify a name.')
));
}
@ -55,10 +54,11 @@ class Setting extends Model {
$value = serialize($value);
}
return Setting::createOrUpdate(array(
$setting = Setting::createOrUpdate(array(
'name' => $key,
'value' => $value
));
return ($setting->id() > 0 && $setting->getErrors() === false);
} else {
$main_key = array_shift($keys);
@ -101,8 +101,7 @@ class Setting extends Model {
}
public static function createOrUpdate($model) {
$exists = self::where('name', $model['name'])
->find_one();
$exists = self::where('name', $model['name'])->findOne();
if($exists === false) {
$new_model = self::create();

View File

@ -62,7 +62,7 @@ class PostTransformer {
// get attachment data (src, width, height)
$image_info = wp_get_attachment_image_src(
$thumbnail_id,
'single-post-thumbnail'
'mailpoet_newsletter_max'
);
// get alt text

View File

@ -11,12 +11,12 @@ class AutomatedLatestContent {
}
function getPostTypes() {
wp_send_json(get_post_types(array(), 'objects'));
return get_post_types(array(), 'objects');
}
function getTaxonomies($args) {
$post_type = (isset($args['postType'])) ? $args['postType'] : 'post';
wp_send_json(get_object_taxonomies($post_type, 'objects'));
return get_object_taxonomies($post_type, 'objects');
}
function getTerms($args) {
@ -24,20 +24,23 @@ class AutomatedLatestContent {
$search = (isset($args['search'])) ? $args['search'] : '';
$limit = (isset($args['limit'])) ? (int)$args['limit'] : 10;
$page = (isset($args['page'])) ? (int)$args['page'] : 1;
wp_send_json(get_terms($taxonomies, array(
'hide_empty' => false,
'search' => $search,
'number' => $limit,
'offset' => $limit * ($page - 1),
)));
return get_terms(
$taxonomies,
array(
'hide_empty' => false,
'search' => $search,
'number' => $limit,
'offset' => $limit * ($page - 1)
)
);
}
function getPosts($args) {
wp_send_json($this->ALC->getPosts($args));
return $this->ALC->getPosts($args);
}
function getTransformedPosts($args) {
$posts = $this->ALC->getPosts($args);
wp_send_json($this->ALC->transformPosts($args, $posts));
return $this->ALC->transformPosts($args, $posts);
}
}

View File

@ -11,7 +11,7 @@ if(!defined('ABSPATH')) exit;
class Cron {
function start() {
$supervisor = new Supervisor($force_run = true);
wp_send_json($supervisor->checkDaemon());
return $supervisor->checkDaemon();
}
function stop() {
@ -22,17 +22,15 @@ class Cron {
$daemon['status'] = 'stopping';
$result = CronHelper::saveDaemon($daemon);
}
wp_send_json(
array(
'result' => $result
)
return array(
'result' => $result
);
}
function getStatus() {
$daemon = Setting::where('name', 'cron_daemon')
->findOne();
wp_send_json(
return (
($daemon) ?
array_merge(
array(

View File

@ -33,30 +33,19 @@ class CustomFields {
function save($data = array()) {
$custom_field = CustomField::createOrUpdate($data);
$errors = $custom_field->getErrors();
if($custom_field === false) {
$result = array(
if(!empty($errors)) {
return array(
'result' => false,
'errors' => array(
__('The custom field could not be created.')
)
'errors' => $errors
);
} else {
$errors = $custom_field->getValidationErrors();
if(!empty($errors)) {
$result = array(
'result' => false,
'errors' => $errors
);
} else {
$result = array(
'result' => true,
'field' => $custom_field->asArray()
);
}
return array(
'result' => true,
'field' => $custom_field->asArray()
);
}
return $result;
}
function get($id) {

View File

@ -11,15 +11,12 @@ class Forms {
function __construct() {
}
function get($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : 0);
function get($id = false) {
$form = Form::findOne($id);
if($form === false) {
wp_send_json(false);
return false;
} else {
$form = $form->asArray();
wp_send_json($form);
return $form->asArray();
}
}
@ -47,12 +44,7 @@ class Forms {
);
}
wp_send_json($listing_data);
}
function getAll() {
$collection = Form::findArray();
wp_send_json($collection);
return $listing_data;
}
function create() {
@ -88,24 +80,23 @@ class Forms {
)
);
$form = Form::createOrUpdate($form_data);
if($form !== false && $form->id()) {
wp_send_json(
admin_url('admin.php?page=mailpoet-form-editor&id='.$form->id())
);
} else {
wp_send_json(false);
}
return $this->save($form_data);
}
function save($data = array()) {
$form = Form::createOrUpdate($data);
$errors = $form->getErrors();
if($form !== false && $form->id()) {
wp_send_json($form->id());
if(!empty($errors)) {
return array(
'result' => false,
'errors' => $errors
);
} else {
wp_send_json($form);
return array(
'result' => true,
'form_id' => $form->id()
);
}
}
@ -119,10 +110,10 @@ class Forms {
// styles
$css = new Util\Styles(FormRenderer::getStyles($data));
wp_send_json(array(
return array(
'html' => $html,
'css' => $css->render()
));
);
}
function exportsEditor($id) {
@ -134,19 +125,19 @@ class Forms {
$exports = Util\Export::getAll($form->asArray());
}
wp_send_json($exports);
return $exports;
}
function saveEditor($data = array()) {
$form_id = (isset($data['id']) ? (int)$data['id'] : 0);
$name = (isset($data['name']) ? $data['name'] : array());
$name = (isset($data['name']) ? $data['name'] : __('New form'));
$body = (isset($data['body']) ? $data['body'] : array());
$settings = (isset($data['settings']) ? $data['settings'] : array());
$styles = (isset($data['styles']) ? $data['styles'] : array());
$styles = (isset($data['styles']) ? $data['styles'] : '');
if(empty($body) || empty($settings)) {
// error
wp_send_json(false);
return false;
} else {
// check if the form is used as a widget
$is_widget = false;
@ -178,7 +169,7 @@ class Forms {
}
}
// check list selectio
// check list selection
if($has_segment_selection === true) {
$settings['segments_selected_by'] = 'user';
} else {
@ -194,45 +185,42 @@ class Forms {
'styles' => $styles
));
// response
wp_send_json(array(
'result' => ($form !== false),
'is_widget' => $is_widget
));
if($form->getErrors() === false) {
return array(
'result' => true,
'is_widget' => $is_widget
);
} else {
return array(
'result' => false,
'errors' => $form->getErrors()
);
}
}
function restore($id) {
$result = false;
$form = Form::findOne($id);
if($form !== false) {
$result = $form->restore();
$form->restore();
}
wp_send_json($result);
return ($form->getErrors() === false);
}
function trash($id) {
$result = false;
$form = Form::findOne($id);
if($form !== false) {
$result = $form->trash();
$form->trash();
}
wp_send_json($result);
return ($form->getErrors() === false);
}
function delete($id) {
$result = false;
$form = Form::findOne($id);
if($form !== false) {
$form->delete();
$result = 1;
return 1;
}
wp_send_json($result);
return false;
}
function duplicate($id) {
@ -246,7 +234,7 @@ class Forms {
$result = $form->duplicate($data)->asArray();
}
wp_send_json($result);
return $result;
}
function bulkAction($data = array()) {
@ -255,6 +243,6 @@ class Forms {
$data
);
wp_send_json($bulk_action->apply());
return $bulk_action->apply();
}
}

View File

@ -10,17 +10,17 @@ if(!defined('ABSPATH')) exit;
class ImportExport {
function getMailChimpLists($data) {
$mailChimp = new MailChimp($data['api_key']);
wp_send_json($mailChimp->getLists());
return $mailChimp->getLists();
}
function getMailChimpSubscribers($data) {
$mailChimp = new MailChimp($data['api_key']);
wp_send_json($mailChimp->getSubscribers($data['lists']));
return $mailChimp->getSubscribers($data['lists']);
}
function addSegment($data) {
$segment = Segment::createOrUpdate($data);
wp_send_json(
return (
($segment->id) ?
array(
'result' => true,
@ -36,7 +36,7 @@ class ImportExport {
$customField = CustomField::create();
$customField->hydrate($data);
$result = $customField->save();
wp_send_json(
return (
($result) ?
array(
'result' => true,
@ -49,12 +49,16 @@ class ImportExport {
}
function processImport($data) {
$import = new \MailPoet\Subscribers\ImportExport\Import\Import(json_decode($data, true));
wp_send_json($import->process());
$import = new \MailPoet\Subscribers\ImportExport\Import\Import(
json_decode($data, true)
);
return $import->process();
}
function processExport($data) {
$export = new \MailPoet\Subscribers\ImportExport\Export\Export(json_decode($data, true));
wp_send_json($export->process());
$export = new \MailPoet\Subscribers\ImportExport\Export\Export(
json_decode($data, true)
);
return $export->process();
}
}

View File

@ -5,16 +5,19 @@ if(!defined('ABSPATH')) exit;
class Mailer {
function send($data) {
$mailer = new \MailPoet\Mailer\Mailer(
(isset($data['mailer'])) ? $data['mailer'] : false,
(isset($data['sender'])) ? $data['sender'] : false,
(isset($data['reply_to'])) ? $data['reply_to'] : false
);
$result = $mailer->send($data['newsletter'], $data['subscriber']);
wp_send_json(
array(
'result' => ($result) ? true : false
)
);
$response = array();
try {
$mailer = new \MailPoet\Mailer\Mailer(
(isset($data['mailer'])) ? $data['mailer'] : false,
(isset($data['sender'])) ? $data['sender'] : false,
(isset($data['reply_to'])) ? $data['reply_to'] : false
);
$result = $mailer->send($data['newsletter'], $data['subscriber']);
} catch(\Exception $e) {
$result = false;
$response['errors'] = array($e->getMessage());
}
$response['result'] = ($result) ? true : false;
return $response;
}
}

View File

@ -9,42 +9,33 @@ class NewsletterTemplates {
function __construct() {
}
function get($data = array()) {
$id = (isset($data['id'])) ? (int) $data['id'] : 0;
function get($id = false) {
$template = NewsletterTemplate::findOne($id);
if($template === false) {
wp_send_json(false);
return false;
} else {
$template->body = json_decode($template->body);
wp_send_json($template->asArray());
return $template->asArray();
}
}
function getAll() {
$collection = NewsletterTemplate::findArray();
$collection = array_map(function($item) {
$item['body'] = json_decode($item['body']);
return $item;
$collection = NewsletterTemplate::findMany();
return array_map(function($item) {
return $item->asArray();
}, $collection);
wp_send_json($collection);
}
function save($data = array()) {
$result = NewsletterTemplate::createOrUpdate($data);
if($result !== true) {
wp_send_json($result);
} else {
wp_send_json(true);
}
$template = NewsletterTemplate::createOrUpdate($data);
return ($template->getErrors() === false && $template->id() > 0);
}
function delete($id) {
$template = NewsletterTemplate::findOne($id);
if($template !== false) {
$result = $template->delete();
return $template->delete();
} else {
$result = false;
return false;
}
wp_send_json($result);
}
}

View File

@ -21,11 +21,10 @@ class Newsletters {
function __construct() {
}
function get($data = array()) {
$id = (isset($data['id'])) ? (int) $data['id'] : 0;
function get($id = false) {
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
wp_send_json(false);
return false;
} else {
$segments = $newsletter->segments()->findArray();
$options = $newsletter->options()->findArray();
@ -34,42 +33,32 @@ class Newsletters {
return $segment['id'];
}, $segments);
$newsletter['options'] = $options;
$newsletter['body'] = json_decode($newsletter['body']);
wp_send_json($newsletter);
return $newsletter;
}
}
function getAll() {
$collection = Newsletter::findArray();
$collection = array_map(function($item) {
$item['body'] = json_decode($item['body']);
return $item;
}, $collection);
wp_send_json($collection);
}
function save($data = array()) {
$segment_ids = array();
if(isset($data['segments'])) {
$segment_ids = $data['segments'];
unset($data['segments']);
}
$options = array();
if(isset($data['options'])) {
$options = $data['options'];
unset($data['options']);
}
$errors = array();
$result = false;
$newsletter = Newsletter::createOrUpdate($data);
$errors = $newsletter->getErrors();
if($newsletter !== false && !$newsletter->id()) {
$errors = $newsletter->getValidationErrors();
if(!empty($errors)) {
return array(
'result' => false,
'errors' => $errors
);
} else {
$result = true;
if(!empty($segment_ids)) {
NewsletterSegment::where('newsletter_id', $newsletter->id)
->deleteMany();
@ -86,132 +75,66 @@ class Newsletters {
NewsletterOption::where('newsletter_id', $newsletter->id)
->deleteMany();
$optionFields = NewsletterOptionField::where(
$option_fields = NewsletterOptionField::where(
'newsletter_type',
$data['type']
)->findArray();
foreach($optionFields as $optionField) {
if(isset($options[$optionField['name']])) {
foreach($option_fields as $option_field) {
if(isset($options[$option_field['name']])) {
$relation = NewsletterOption::create();
$relation->newsletter_id = $newsletter->id;
$relation->option_field_id = $optionField['id'];
$relation->value = $options[$optionField['name']];
$relation->option_field_id = $option_field['id'];
$relation->value = $options[$option_field['name']];
$relation->save();
}
}
}
return array(
'result' => true
);
}
wp_send_json(array(
'result' => $result,
'errors' => $errors
));
}
function restore($id) {
$result = false;
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$result = $newsletter->restore();
$newsletter->restore();
}
wp_send_json($result);
return ($newsletter->getErrors() === false);
}
function trash($id) {
$result = false;
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$result = $newsletter->trash();
$newsletter->trash();
}
wp_send_json($result);
return ($newsletter->getErrors() === false);
}
function delete($id) {
$result = false;
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$newsletter->delete();
$result = 1;
return 1;
}
wp_send_json($result);
return false;
}
function duplicate($id) {
$result = false;
function duplicate($id = false) {
$newsletter = Newsletter::findOne($id);
if($newsletter !== false) {
$data = array(
return $newsletter->duplicate(array(
'subject' => sprintf(__('Copy of %s'), $newsletter->subject)
);
$result = $newsletter->duplicate($data)->asArray();
))->asArray();
}
wp_send_json($result);
}
function send($data = array()) {
$newsletter = Newsletter::findOne($data['id'])->asArray();
if(empty($data['segments'])) {
return wp_send_json(array(
'errors' => array(
__("You need to select a list.")
)
));
}
$segments = Segment::whereIdIn($data['segments'])->findMany();
$subscribers = array();
foreach($segments as $segment) {
$segment_subscribers = $segment->subscribers()->findMany();
foreach($segment_subscribers as $segment_subscriber) {
$subscribers[$segment_subscriber->email] = $segment_subscriber
->asArray();
}
}
if(empty($subscribers)) {
return wp_send_json(array(
'errors' => array(
__("No subscribers found.")
)
));
}
// TODO: TO REMOVE once we add the columns from/reply_to
$newsletter = array_merge($newsletter, $data['newsletter']);
// END - TO REMOVE
$renderer = new Renderer(json_decode($newsletter['body'], true));
$newsletter['body'] = $renderer->render();
$subscribers = Subscriber::find_array();
$fromEmail = Setting::where('name', 'from_address')->findOne()->value;
$fromName = Setting::where('name', 'from_name')->findOne()->value;
$apiKey = Setting::where('name', 'api_key')->findOne()->value;
$mailer = new MailPoet($apiKey, $fromEmail, $fromName);
foreach ($subscribers as $subscriber) {
$result = $mailer->send(
$newsletter,
sprintf('%s %s <%s>', $subscriber['first_name'], $subscriber['last_name'], $subscriber['email'])
);
if ($result !== true) wp_send_json(false);
}
wp_send_json(true);
return false;
}
function render($data = array()) {
if(!isset($data['body'])) {
wp_send_json(false);
return false;
}
$renderer = new Renderer($data);
$rendered_newsletter = $renderer->render();
@ -220,7 +143,7 @@ class Newsletters {
$data
);
$rendered_newsletter = $shortcodes->replace();
wp_send_json(array('rendered_body' => $rendered_newsletter));
return array('rendered_body' => $rendered_newsletter);
}
function sendPreview($data = array()) {
@ -228,15 +151,15 @@ class Newsletters {
$newsletter = Newsletter::findOne($id);
if($newsletter === false) {
wp_send_json(array(
return array(
'result' => false
));
);
}
if(empty($data['subscriber'])) {
wp_send_json(array(
return array(
'result' => false,
'errors' => array(__('Please specify receiver information')),
));
'errors' => array(__('Please specify receiver information'))
);
}
$newsletter = $newsletter->asArray();
@ -264,15 +187,14 @@ class Newsletters {
$sender = false,
$reply_to = false
);
$result = $mailer->send($newsletter, $data['subscriber']);
wp_send_json(array(
'result' => $mailer->send($newsletter, $data['subscriber'])
));
return array('result' => $result);
} catch(\Exception $e) {
wp_send_json(array(
return array(
'result' => false,
'errors' => array($e->getMessage()),
));
);
}
}
@ -300,7 +222,7 @@ class Newsletters {
$item['queue'] = ($queue !== false) ? $queue->asArray() : null;
}
wp_send_json($listing_data);
return $listing_data;
}
function bulkAction($data = array()) {
@ -308,46 +230,54 @@ class Newsletters {
'\MailPoet\Models\Newsletter',
$data
);
wp_send_json($bulk_action->apply());
return $bulk_action->apply();
}
function create($data = array()) {
$newsletter = Newsletter::create();
$newsletter->type = $data['type'];
$newsletter->subject = $data['subject'];
$newsletter->body = '{}';
// try to load template data
$template_id = (!empty($data['template']) ? (int)$data['template'] : 0);
$template = NewsletterTemplate::findOne($template_id);
if($template !== false) {
$newsletter->body = $template->body;
}
$options = array();
if(isset($data['options'])) {
$options = $data['options'];
unset($data['options']);
}
$result = $newsletter->save();
if($result !== true) {
wp_send_json($newsletter->getValidationErrors());
$newsletter = Newsletter::createOrUpdate($data);
// try to load template data
$template_id = (!empty($data['template']) ? (int)$data['template'] : false);
$template = NewsletterTemplate::findOne($template_id);
if($template !== false) {
$newsletter->body = $template->body;
} else {
$newsletter->body = array();
}
$newsletter->save();
$errors = $newsletter->getErrors();
if(!empty($errors)) {
return array(
'result' => false,
'errors' =>$errors
);
} else {
if(!empty($options)) {
$optionFields = NewsletterOptionField::where('newsletter_type', $newsletter->type)->findArray();
$option_fields = NewsletterOptionField::where(
'newsletter_type', $newsletter->type
)->findArray();
foreach($optionFields as $optionField) {
if(isset($options[$optionField['name']])) {
foreach($option_fields as $option_field) {
if(isset($options[$option_field['name']])) {
$relation = NewsletterOption::create();
$relation->newsletter_id = $newsletter->id;
$relation->option_field_id = $optionField['id'];
$relation->value = $options[$optionField['name']];
$relation->option_field_id = $option_field['id'];
$relation->value = $options[$option_field['name']];
$relation->save();
}
}
}
$newsletter->body = json_decode($newsletter->body);
wp_send_json($newsletter->asArray());
return array(
'result' => true,
'newsletter' => $newsletter->asArray()
);
}
}
}

View File

@ -8,7 +8,6 @@ class Permissions {
}
function set($permissions = array()) {
$result = \MailPoet\Util\Permissions::set($permissions);
wp_send_json($result);
return \MailPoet\Util\Permissions::set($permissions);
}
}

View File

@ -12,14 +12,12 @@ class Segments {
function __construct() {
}
function get($data = array()) {
$id = (isset($data['id']) ? (int)$data['id'] : 0);
function get($id = false) {
$segment = Segment::findOne($id);
if($segment === false) {
wp_send_json(false);
return false;
} else {
wp_send_json($segment->asArray());
return $segment->asArray();
}
}
@ -64,12 +62,7 @@ class Segments {
);
}
wp_send_json($listing_data);
}
function getAll() {
$collection = Segment::findArray();
wp_send_json($collection);
return $listing_data;
}
function save($data = array()) {
@ -83,44 +76,35 @@ class Segments {
} else {
$result = true;
}
wp_send_json(array(
return array(
'result' => $result,
'errors' => $errors
));
);
}
function restore($id) {
$result = false;
$segment = Segment::findOne($id);
if($segment !== false) {
$result = $segment->restore();
$segment->restore();
}
wp_send_json($result);
return ($segment->getErrors() === false);
}
function trash($id) {
$result = false;
$segment = Segment::findOne($id);
if($segment !== false) {
$result = $segment->trash();
$segment->trash();
}
wp_send_json($result);
return ($segment->getErrors() === false);
}
function delete($id) {
$result = false;
$segment = Segment::findOne($id);
if($segment !== false) {
$segment->delete();
$result = 1;
return 1;
}
wp_send_json($result);
return false;
}
function duplicate($id) {
@ -134,13 +118,13 @@ class Segments {
$result = $segment->duplicate($data)->asArray();
}
wp_send_json($result);
return $result;
}
function synchronize() {
$result = WP::synchronizeUsers();
wp_send_json($result);
return $result;
}
function bulkAction($data = array()) {
@ -149,6 +133,6 @@ class Segments {
$data
);
wp_send_json($bulk_action->apply());
return $bulk_action->apply();
}
}

View File

@ -10,17 +10,17 @@ class Settings {
function get() {
$settings = Setting::getAll();
wp_send_json($settings);
return $settings;
}
function set($settings = array()) {
if(empty($settings)) {
wp_send_json(false);
return false;
} else {
foreach($settings as $name => $value) {
Setting::setValue($name, $value);
}
wp_send_json(true);
return true;
}
}
}

View File

@ -17,8 +17,8 @@ class Setup {
} catch(Exception $e) {
$result = false;
}
wp_send_json(array(
return array(
'result' => $result
));
);
}
}

View File

@ -15,9 +15,7 @@ class Subscribers {
function __construct() {
}
function get($data = array()) {
$id = (isset($data['id']) ? (int) $data['id'] : 0);
function get($id = false) {
$subscriber = Subscriber::findOne($id);
if($subscriber !== false && $subscriber->id() > 0) {
$segments = $subscriber->segments()->findArray();
@ -58,35 +56,30 @@ class Subscribers {
return $listing_data;
}
function getAll() {
return Subscriber::findArray();
}
function save($data = array()) {
$errors = array();
$result = false;
$segment_ids = array();
if(array_key_exists('segments', $data)) {
if(isset($data['segments'])) {
$segment_ids = (array)$data['segments'];
unset($data['segments']);
}
$subscriber = Subscriber::createOrUpdate($data);
$errors = $subscriber->getErrors();
if($subscriber !== false && !$subscriber->id()) {
$errors = $subscriber->getValidationErrors();
if(!empty($errors)) {
return array(
'result' => false,
'errors' => $errors
);
} else {
$result = true;
if(!empty($segment_ids)) {
$subscriber->addToSegments($segment_ids);
}
return array(
'result' => true
);
}
return array(
'result' => $result,
'errors' => $errors
);
}
function subscribe($data = array()) {
@ -193,37 +186,28 @@ class Subscribers {
}
function restore($id) {
$result = false;
$subscriber = Subscriber::findOne($id);
if($subscriber !== false) {
$result = $subscriber->restore();
$subscriber->restore();
}
return $result;
return ($subscriber->getErrors() === false);
}
function trash($id) {
$result = false;
$subscriber = Subscriber::findOne($id);
if($subscriber !== false) {
$result = $subscriber->trash();
$subscriber->trash();
}
return $result;
return ($subscriber->getErrors() === false);
}
function delete($id) {
$result = false;
$subscriber = Subscriber::findOne($id);
if($subscriber !== false) {
$subscriber->delete();
$result = 1;
return 1;
}
return $result;
return false;
}
function bulkAction($data = array()) {

View File

@ -61,10 +61,10 @@ class WP {
$segment = Segment::getWPUsers();
// count WP users
$users_count = \count_users()['total_users'];
$users_count = \count_users();
$linked_subscribers_count = $segment->subscribers()->count();
if($users_count !== $linked_subscribers_count) {
if($users_count['total_users'] !== $linked_subscribers_count) {
$linked_subscribers = Subscriber::select('wp_user_id')
->whereNotNull('wp_user_id')
->findArray();

View File

@ -16,7 +16,7 @@ class Import {
public $subscribers_count;
public $import_time;
public $profiler_start;
public function __construct($data) {
$this->subscribers_data = $data['subscribers'];
$this->segments = $data['segments'];
@ -31,7 +31,7 @@ class Import {
$this->import_time = date('Y-m-d H:i:s');
$this->profiler_start = microtime(true);
}
function process() {
$subscriber_fields = $this->subscriber_fields;
$subscriber_custom_fields = $this->subscriber_custom_fields;
@ -89,7 +89,7 @@ class Import {
'profiler' => $this->timeExecution()
);
}
function filterExistingAndNewSubscribers($subscribers_data) {
$existing_records = array_filter(
array_map(function($subscriber_emails) {
@ -126,7 +126,7 @@ class Import {
}, $new_records);
}, $subscribers_data)
);
$existing_subscribers =
array_map(function($subscriber) use ($new_records) {
return array_values( // reindex array
@ -142,7 +142,7 @@ class Import {
$new_subscribers
);
}
function deleteExistingTrashedSubscribers($subscribers_data) {
$existing_trashed_records = array_filter(
array_map(function($subscriber_emails) {
@ -161,7 +161,7 @@ class Import {
->deleteMany();
}
}
function extendSubscribersAndFields($subscribers_data, $subscriber_fields) {
$subscribers_data['created_at'] = $this->filterSubscriberCreatedAtDate();
$subscriber_fields[] = 'created_at';
@ -170,7 +170,7 @@ class Import {
$subscriber_fields
);
}
function getSubscriberFields($subscriber_fields) {
return array_values(
array_filter(
@ -180,7 +180,7 @@ class Import {
)
);
}
function getCustomSubscriberFields($subscriber_fields) {
return array_values(
array_filter(
@ -190,11 +190,11 @@ class Import {
)
);
}
function filterSubscriberCreatedAtDate() {
return array_fill(0, $this->subscribers_count, $this->import_time);
}
function filterSubscriberStatus($subscribers_data, $subscriber_fields) {
if(!in_array('status', $subscriber_fields)) {
$subscribers_data['status'] =
@ -242,7 +242,7 @@ class Import {
$subscriber_fields
);
}
function createOrUpdateSubscribers(
$action,
$subscribers_data,
@ -295,7 +295,7 @@ class Import {
);
return $result;
}
function createOrUpdateCustomFields(
$action,
$db_subscribers,
@ -318,8 +318,8 @@ class Import {
$value
);
}, $count, $subscribers_data[$column]);
}, $subscriber_custom_fields)[0];
foreach(array_chunk($subscribers, 200) as $data) {
}, $subscriber_custom_fields);
foreach(array_chunk($subscribers[0], 200) as $data) {
if($action === 'create') {
SubscriberCustomField::createMultiple(
$data
@ -332,13 +332,13 @@ class Import {
}
}
}
function addSubscribersToSegments($subscribers, $segments) {
foreach(array_chunk($subscribers, 200) as $data) {
SubscriberSegment::createMultiple($segments, $data);
}
}
function timeExecution() {
$profiler_end = microtime(true);
return ($profiler_end - $this->profiler_start) / 60;

View File

@ -1,12 +1,10 @@
<?php
use \MailPoet\Config\Initializer;
use \MailPoet\Config\Migrator;
if(!defined('ABSPATH')) exit;
use \MailPoet\Config\Initializer;
/*
* Plugin Name: MailPoet
* Version: 0.0.13
* Version: 0.0.14
* Plugin URI: http://www.mailpoet.com
* Description: MailPoet Newsletters.
* Author: MailPoet
@ -24,16 +22,10 @@ if(!defined('ABSPATH')) exit;
require 'vendor/autoload.php';
define('MAILPOET_VERSION', '0.0.13');
define('MAILPOET_VERSION', '0.0.14');
$initializer = new Initializer(array(
'file' => __FILE__,
'version' => MAILPOET_VERSION
));
$migrator = new Migrator();
register_activation_hook(__FILE__, array($migrator, 'up'));
register_activation_hook(__FILE__, array($initializer, 'runPopulator'));
add_action('init', array($initializer, 'init'));
$initializer->init();

View File

@ -9,6 +9,7 @@ $console->writeln('Loading WP core... ('.$wp_load_file.')');
$console->writeln('Cleaning up database...');
$models = array(
'CustomField',
'Form',
'Newsletter',
'NewsletterSegment',
'NewsletterTemplate',

View File

@ -94,6 +94,7 @@ class MailerCest {
}
function itCanSend() {
if(getenv('WP_TEST_MAILER_ENABLE_SENDING') !== 'true') return;
$mailer = new Mailer($this->mailer, $this->sender, $this->reply_to);
expect($mailer->send($this->newsletter, $this->subscriber))->true();
}

View File

@ -30,7 +30,8 @@ class CustomFieldCest {
}
function itCanBeCreated() {
expect($this->saved)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itCanHaveName() {
@ -42,14 +43,18 @@ class CustomFieldCest {
}
function itCanHaveParams() {
expect(unserialize($this->customField->params))->equals($this->data['params']);
expect($this->customField->params)->equals($this->data['params']);
}
function itHasToBeValid() {
$empty_model = CustomField::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(2);
$invalid_custom_field = CustomField::create();
$result = $invalid_custom_field->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
expect($errors[1])->equals('You need to specify a type.');
}
function itHasACreatedAtOnCreation() {

View File

@ -14,15 +14,17 @@ class FormCest {
}
function itCanBeCreated() {
expect($this->saved)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasToBeValid() {
expect($this->saved)->equals(true);
$empty_model = Form::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(1);
$invalid_form = Form::create();
$result = $invalid_form->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
}
function itHasACreatedAtOnCreation() {

View File

@ -11,19 +11,20 @@ class NewsletterCest {
$this->before_time = time();
$this->data = array(
'subject' => 'new newsletter',
'body' => 'body',
'type' => 'standard',
'body' => 'body',
'preheader' => 'preheader'
);
$newsletter = Newsletter::create();
$newsletter->hydrate($this->data);
$this->newsletter = $newsletter;
$this->result = $newsletter->save();
$this->saved = $newsletter->save();
}
function itCanBeCreated() {
expect($this->result)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasSubject() {
@ -77,10 +78,11 @@ class NewsletterCest {
$is_created = Newsletter::createOrUpdate(
array(
'subject' => 'new newsletter',
'type' => 'standard',
'body' => 'body'
));
expect($is_created)->notEquals(false);
expect($is_created->getValidationErrors())->isEmpty();
expect($is_created->id() > 0)->true();
expect($is_created->getErrors())->false();
$newsletter = Newsletter::where('subject', 'new newsletter')
->findOne();
@ -89,8 +91,7 @@ class NewsletterCest {
$is_updated = Newsletter::createOrUpdate(
array(
'id' => $newsletter->id,
'subject' => 'updated newsletter',
'body' => 'body'
'subject' => 'updated newsletter'
));
$newsletter = Newsletter::findOne($newsletter->id);
expect($newsletter->subject)->equals('updated newsletter');
@ -100,6 +101,7 @@ class NewsletterCest {
Newsletter::createOrUpdate(
array(
'subject' => 'search for "pineapple"',
'type' => 'standard',
'body' => 'body'
));
$newsletter = Newsletter::filter('search', 'pineapple')

View File

@ -9,19 +9,21 @@ class NewsletterOptionFieldCest {
$this->before_time = time();
$this->data = array(
'name' => 'Event',
'newsletter_type' => 'welcome',
'newsletter_type' => 'welcome'
);
$this->optionField = NewsletterOptionField::create();
$this->optionField->hydrate($this->data);
$this->saved = $this->optionField->save();
$this->newslettersData = array(
$this->option_field = NewsletterOptionField::create();
$this->option_field->hydrate($this->data);
$this->saved = $this->option_field->save();
$this->newsletter_data = array(
array(
'subject' => 'Test newsletter 1',
'type' => 'standard',
'preheader' => '',
'body' => '{}'
),
array(
'subject' => 'Test newsletter 2',
'type' => 'standard',
'preheader' => 'A newsletter',
'body' => '{}'
)
@ -29,89 +31,92 @@ class NewsletterOptionFieldCest {
}
function itCanBeCreated() {
expect($this->saved)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasName() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
expect($optionField->name)->equals($this->data['name']);
expect($option_field->name)->equals($this->data['name']);
}
function itHasNewsletterType() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
expect($optionField->newsletter_type)->equals($this->data['newsletter_type']);
expect($option_field->newsletter_type)->equals($this->data['newsletter_type']);
}
function itHasToBeValid() {
expect($this->saved)->equals(true);
$empty_model = NewsletterOptionField::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(2);
$invalid_newsletter_option = NewsletterOptionField::create();
$result = $invalid_newsletter_option->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
expect($errors[1])->equals('You need to specify a newsletter type.');
}
function itHasACreatedAtOnCreation() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
$time_difference = strtotime($optionField->created_at) >= $this->before_time;
$time_difference = strtotime($option_field->created_at) >= $this->before_time;
expect($time_difference)->equals(true);
}
function itHasAnUpdatedAtOnCreation() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
$time_difference = strtotime($optionField->updated_at) >= $this->before_time;
$time_difference = strtotime($option_field->updated_at) >= $this->before_time;
expect($time_difference)->equals(true);
}
function itKeepsTheCreatedAtOnUpdate() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
$old_created_at = $optionField->created_at;
$optionField->name = 'new name';
$optionField->save();
expect($old_created_at)->equals($optionField->created_at);
$old_created_at = $option_field->created_at;
$option_field->name = 'new name';
$option_field->save();
expect($old_created_at)->equals($option_field->created_at);
}
function itUpdatesTheUpdatedAtOnUpdate() {
$optionField = NewsletterOptionField::where('name', $this->data['name'])
$option_field = NewsletterOptionField::where('name', $this->data['name'])
->findOne();
$update_time = time();
$optionField->name = 'new name';
$optionField->save();
$time_difference = strtotime($optionField->updated_at) >= $update_time;
$option_field->name = 'new name';
$option_field->save();
$time_difference = strtotime($option_field->updated_at) >= $update_time;
expect($time_difference)->equals(true);
}
function itCanHaveManyNewsletters() {
foreach ($this->newslettersData as $data) {
foreach($this->newsletter_data as $data) {
$newsletter = Newsletter::create();
$newsletter->hydrate($data);
$newsletter->save();
$association = NewsletterOption::create();
$association->newsletter_id = $newsletter->id;
$association->option_field_id = $this->optionField->id;
$association->option_field_id = $this->option_field->id;
$association->save();
}
$optionField = NewsletterOptionField::findOne($this->optionField->id);
$newsletters = $optionField->newsletters()
$option_field = NewsletterOptionField::findOne($this->option_field->id);
$newsletters = $option_field->newsletters()
->findArray();
expect(count($newsletters))->equals(2);
}
function itCanStoreOptionValue() {
$newsletter = Newsletter::create();
$newsletter->hydrate($this->newslettersData[0]);
$newsletter->hydrate($this->newsletter_data[0]);
$newsletter->save();
$association = NewsletterOption::create();
$association->newsletter_id = $newsletter->id;
$association->option_field_id = $this->optionField->id;
$association->option_field_id = $this->option_field->id;
$association->value = 'list';
$association->save();
$optionField = NewsletterOptionField::findOne($this->optionField->id);
$newsletter = $optionField->newsletters()
$option_field = NewsletterOptionField::findOne($this->option_field->id);
$newsletter = $option_field->newsletters()
->findOne();
expect($newsletter->value)->equals($association->value);
}

View File

@ -8,23 +8,27 @@ class NewsletterTemplateCest {
$this->data = array(
'name' => 'Some template',
'description' => 'My nice template',
'body' => '{content: {}, globalStyles: {}}',
'body' => '{}',
);
$template = NewsletterTemplate::create();
$template->hydrate($this->data);
$this->result = $template->save();
$this->saved = $template->save();
}
function itCanBeCreated() {
expect($this->result)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasToBeValid() {
$empty_model = NewsletterTemplate::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(2);
$invalid_newsletter_template = NewsletterTemplate::create();
$result = $invalid_newsletter_template->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
expect($errors[1])->equals('Template body cannot be empty.');
}
function itHasName() {
@ -46,25 +50,28 @@ class NewsletterTemplateCest {
}
function itCanCreateOrUpdate() {
$is_created = NewsletterTemplate::createOrUpdate(
$created_template = NewsletterTemplate::createOrUpdate(
array(
'name' => 'Another template',
'description' => 'Another template description',
'body' => '{content: {}, globalStyles: {}}',
));
expect($is_created)->equals(true);
expect($created_template->id() > 0)->true();
expect($created_template->getErrors())->false();
$template = NewsletterTemplate::where('name', 'Another template')
->findOne();
expect($template->name)->equals('Another template');
$is_updated = NewsletterTemplate::createOrUpdate(
$updated_template = NewsletterTemplate::createOrUpdate(
array(
'id' => $template->id,
'name' => 'Another template updated',
'body' => '{}'
));
expect($is_updated)->equals(true);
expect($updated_template->id() > 0)->true();
expect($updated_template->getErrors())->false();
$template = NewsletterTemplate::findOne($template->id);
expect($template->name)->equals('Another template updated');
}

View File

@ -13,7 +13,7 @@ class SegmentCest {
'name' => 'some name',
'description' => 'some description'
);
$this->subscribersData = array(
$this->subscribers_data = array(
array(
'first_name' => 'John',
'last_name' => 'Mailer',
@ -27,21 +27,22 @@ class SegmentCest {
'email' => 'mike@maipoet.com'
)
);
$this->newslettersData = array(
$this->newsletters_data = array(
array(
'subject' => 'My first newsletter'
'subject' => 'My first newsletter',
'type' => 'standard'
),
array(
'subject' => 'My second newsletter'
'subject' => 'My second newsletter',
'type' => 'standard'
)
);
$this->segment = Segment::create();
$this->segment->hydrate($this->data);
$this->saved = $this->segment->save();
$this->segment = Segment::createOrUpdate($this->data);
}
function itCanBeCreated() {
expect($this->saved)->equals(true);
expect($this->segment->id() > 0)->true();
expect($this->segment->getErrors())->false();
}
function itCanHaveName() {
@ -51,7 +52,11 @@ class SegmentCest {
function nameMustBeUnique() {
$segment = Segment::create();
$segment->hydrate($this->data);
expect($segment->save())->contains('Duplicate');
$result = $segment->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->contains('Duplicate');
}
function itCanHaveDescription() {
@ -59,11 +64,13 @@ class SegmentCest {
}
function itHasToBeValid() {
expect($this->saved)->equals(true);
$empty_model = Segment::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(1);
$invalid_segment = Segment::create();
$result = $invalid_segment->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
}
function itHasACreatedAtOnCreation() {
@ -101,10 +108,10 @@ class SegmentCest {
function itCanCreateOrUpdate() {
$is_created = Segment::createOrUpdate(array(
'name' => 'new list'
));
expect($is_created)->notEquals(false);
expect($is_created->getValidationErrors())->isEmpty();
'name' => 'new list'
));
expect($is_created->id() > 0)->true();
expect($is_created->getErrors())->false();
$segment = Segment::where('name', 'new list')
->findOne();
@ -121,9 +128,9 @@ class SegmentCest {
}
function itCanHaveManySubscribers() {
foreach ($this->subscribersData as $subscriberData) {
foreach($this->subscribers_data as $subscriber_data) {
$subscriber = Subscriber::create();
$subscriber->hydrate($subscriberData);
$subscriber->hydrate($subscriber_data);
$subscriber->save();
$association = SubscriberSegment::create();
$association->subscriber_id = $subscriber->id;
@ -138,9 +145,9 @@ class SegmentCest {
}
function itCanHaveManyNewsletters() {
foreach ($this->newslettersData as $newsletterData) {
foreach($this->newsletters_data as $newsletter_data) {
$newsletter = Newsletter::create();
$newsletter->hydrate($newsletterData);
$newsletter->hydrate($newsletter_data);
$newsletter->save();
$association = NewsletterSegment::create();
$association->newsletter_id = $newsletter->id;
@ -155,9 +162,9 @@ class SegmentCest {
}
function itCanGetSegmentsWithSubscriberCount() {
foreach ($this->subscribersData as $subscriberData) {
foreach($this->subscribers_data as $subscriber_data) {
$subscriber = Subscriber::create();
$subscriber->hydrate($subscriberData);
$subscriber->hydrate($subscriber_data);
$subscriber->save();
$association = SubscriberSegment::create();
$association->subscriber_id = $subscriber->id;
@ -169,9 +176,9 @@ class SegmentCest {
}
function itCanGetSegmentsForExport() {
foreach ($this->subscribersData as $index => $subscriberData) {
foreach($this->subscribers_data as $index => $subscriber_data) {
$subscriber = Subscriber::create();
$subscriber->hydrate($subscriberData);
$subscriber->hydrate($subscriber_data);
$subscriber->save();
if(!$index) {
$association = SubscriberSegment::create();

View File

@ -11,19 +11,21 @@ class SettingCest {
$setting = Setting::create();
$setting->hydrate($this->data);
$this->result = $setting->save();
$this->saved = $setting->save();
}
function itCanBeCreated() {
expect($this->result)->equals(true);
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasToBeValid() {
expect($this->result)->equals(true);
$empty_model = Setting::create();
expect($empty_model->save())->notEquals(true);
$validations = $empty_model->getValidationErrors();
expect(count($validations))->equals(2);
$invalid_setting = Setting::create();
$result = $invalid_setting->save();
$errors = $result->getErrors();
expect(is_array($errors))->true();
expect($errors[0])->equals('You need to specify a name.');
}
function itHasACreatedAtOnCreation() {
@ -65,18 +67,20 @@ class SettingCest {
'value' => 'data'
);
$result = Setting::createOrUpdate($data);
expect($result)->equals(true);
$record = Setting::where('name', $data['name'])
->find_one();
expect($record->value)->equals($data['value']);
$created_setting = Setting::createOrUpdate($data);
expect($created_setting->id() > 0)->true();
expect($created_setting->getErrors())->false();
$setting = Setting::where('name', $data['name'])->findOne();
expect($setting->value)->equals($data['value']);
$data['value'] = 'new data';
$result = Setting::createOrUpdate($data);
expect($result)->equals(true);
$record = Setting::where('name', $data['name'])
->find_one();
expect($record->value)->equals('new data');
$updated_setting = Setting::createOrUpdate($data);
expect($updated_setting->id() > 0)->true();
expect($updated_setting->getErrors())->false();
$setting = Setting::where('name', $data['name'])->findOne();
expect($setting->value)->equals('new data');
}
function itCanGetAndSetValue() {

View File

@ -20,7 +20,8 @@ class SubscriberCest {
}
function itCanBeCreated() {
expect($this->saved)->true();
expect($this->saved->id() > 0)->true();
expect($this->saved->getErrors())->false();
}
function itHasFirstName() {
@ -62,14 +63,13 @@ class SubscriberCest {
}
function itCanChangeStatus() {
$subscriber = Subscriber::where('email', $this->data['email'])
->findOne();
$subscriber = Subscriber::where('email', $this->data['email'])->findOne();
$subscriber->status = 'subscribed';
expect($subscriber->save())->equals(true);
$subscriber_updated = Subscriber::where(
'email',
$this->data['email']
)
$subscriber->save();
expect($subscriber->id() > 0)->true();
expect($subscriber->getErrors())->false();
$subscriber_updated = Subscriber::where('email', $this->data['email'])
->findOne();
expect($subscriber_updated->status)->equals('subscribed');
}
@ -89,91 +89,78 @@ class SubscriberCest {
function itHasGroupFilter() {
$subscribers = Subscriber::filter('groupBy', 'unconfirmed')
->findMany();
foreach ($subscribers as $subscriber) {
foreach($subscribers as $subscriber) {
expect($subscriber->status)->equals('unconfirmed');
}
$subscribers = Subscriber::filter('groupBy', 'subscribed')
->findMany();
foreach ($subscribers as $subscriber) {
foreach($subscribers as $subscriber) {
expect($subscriber->status)->equals('subscribed');
}
$subscribers = Subscriber::filter('groupBy', 'unsubscribed')
->findMany();
foreach ($subscribers as $subscriber) {
foreach($subscribers as $subscriber) {
expect($subscriber->status)->equals('unsubscribed');
}
}
function itCanHaveSegment() {
$segmentData = array(
$segment = Segment::createOrUpdate(array(
'name' => 'some name'
);
$segment = Segment::create();
$segment->hydrate($segmentData);
$segment->save();
));
expect($segment->getErrors())->false();
$association = SubscriberSegment::create();
$association->subscriber_id = $this->subscriber->id;
$association->segment_id = $segment->id;
$association->save();
$subscriber = Subscriber::findOne($this->subscriber->id);
$subscriberSegment = $subscriber->segments()
->findOne();
expect($subscriberSegment->id)->equals($segment->id);
$subscriber_segment = $subscriber->segments()->findOne();
expect($subscriber_segment->id)->equals($segment->id);
}
function itCanHaveCustomFields() {
$customFieldData = array(
$custom_field = CustomField::createOrUpdate(array(
'name' => 'DOB',
'type' => 'date',
);
$customField = CustomField::create();
$customField->hydrate($customFieldData);
$customField->save();
));
$association = SubscriberCustomField::create();
$association->subscriber_id = $this->subscriber->id;
$association->custom_field_id = $customField->id;
$association->custom_field_id = $custom_field->id;
$association->value = '12/12/2012';
$association->save();
$subscriber = Subscriber::filter('filterWithCustomFields')
->findOne($this->subscriber->id);
expect($subscriber->DOB)->equals($association->value);
}
function itCanFilterCustomFields() {
$customFieldData = array(
array(
'name' => 'City',
'type' => 'text',
),
array(
'name' => 'Country',
'type' => 'text',
)
);
foreach ($customFieldData as $data) {
$customField = CustomField::create();
$customField->hydrate($data);
$customField->save();
$createdCustomFields[] = $customField->asArray();
}
$subscriberCustomFieldData = array(
array(
'subscriber_id' => $this->subscriber->id,
'custom_field_id' => $createdCustomFields[0]['id'],
'value' => 'Paris'
),
array(
'subscriber_id' => $this->subscriber->id,
'custom_field_id' => $createdCustomFields[1]['id'],
'value' => 'France'
)
);
foreach ($subscriberCustomFieldData as $data) {
$association = SubscriberCustomField::create();
$association->hydrate($data);
$association->save();
$createdAssociations[] = $association->asArray();
}
$cf_city = CustomField::createOrUpdate(array(
'name' => 'City',
'type' => 'text'
));
SubscriberCustomField::createOrUpdate(array(
'subscriber_id' => $this->subscriber->id,
'custom_field_id' => $cf_city->id,
'value' => 'Paris'
));
$cf_country = CustomField::createOrUpdate(array(
'name' => 'Country',
'type' => 'text'
));
SubscriberCustomField::createOrUpdate(array(
'subscriber_id' => $this->subscriber->id,
'custom_field_id' => $cf_country->id,
'value' => 'France'
));
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -196,6 +183,7 @@ class SubscriberCest {
))
->findArray();
expect(empty($subscriber))->false();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -209,6 +197,7 @@ class SubscriberCest {
), 'OR')
->findArray();
expect(empty($subscriber))->false();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -218,6 +207,7 @@ class SubscriberCest {
), 'AND', 'LIKE')
->findArray();
expect(empty($subscriber))->false();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -227,6 +217,7 @@ class SubscriberCest {
))
->findArray();
expect(empty($subscriber))->true();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -240,6 +231,7 @@ class SubscriberCest {
))
->findArray();
expect(empty($subscriber))->true();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -253,6 +245,7 @@ class SubscriberCest {
), 'OR')
->findArray();
expect(empty($subscriber))->true();
$subscriber = Subscriber::filter('filterWithCustomFields')
->filter('filterSearchCustomFields', array(
array(
@ -271,8 +264,8 @@ class SubscriberCest {
'last_name' => 'Doe'
);
$result = Subscriber::createOrUpdate($data);
expect($result)->notEquals(false);
expect($result->getValidationErrors())->isEmpty();
expect($result->id() > 0)->true();
expect($result->getErrors())->false();
$record = Subscriber::where('email', $data['email'])
->findOne();

View File

@ -20,7 +20,9 @@ class SubscriberCustomFieldCest {
function itCanBeCreated() {
$subscriberCustomField = SubscriberCustomField::create();
$subscriberCustomField->hydrate($this->data[0]);
expect($subscriberCustomField->save())->true();
$subscriberCustomField->save();
expect($subscriberCustomField->id() > 0)->true();
expect($subscriberCustomField->getErrors())->false();
}
function itCanCreateOrUpdateMultipleRecords() {

View File

@ -0,0 +1,172 @@
<?php
use \MailPoet\Router\Forms;
use \MailPoet\Models\Form;
use \MailPoet\Models\Segment;
class FormsCest {
function _before() {
Form::createOrUpdate(array('name' => 'Form 1'));
Form::createOrUpdate(array('name' => 'Form 2'));
Form::createOrUpdate(array('name' => 'Form 3'));
Segment::createOrUpdate(array('name' => 'Segment 1'));
Segment::createOrUpdate(array('name' => 'Segment 2'));
}
function itCanGetAForm() {
$form = Form::where('name', 'Form 1')->findOne();
$router = new Forms();
$response = $router->get(/* missing id */);
expect($response)->false();
$response = $router->get('not_an_id');
expect($response)->false();
$response = $router->get($form->id);
expect($response['id'])->equals($form->id);
expect($response['name'])->equals($form->name);
}
function itCanGetListingData() {
$router = new Forms();
$response = $router->listing();
expect($response)->hasKey('filters');
expect($response)->hasKey('groups');
expect($response['count'])->equals(3);
expect($response['items'])->count(3);
expect($response['items'][0]['name'])->equals('Form 1');
expect($response['items'][1]['name'])->equals('Form 2');
expect($response['items'][2]['name'])->equals('Form 3');
}
function itCanCreateANewForm() {
$router = new Forms();
$response = $router->create();
expect($response['result'])->true();
expect($response['form_id'] > 0)->true();
expect($response)->hasntKey('errors');
$created_form = Form::findOne($response['form_id']);
expect($created_form->name)->equals('New form');
}
function itCanSaveAForm() {
$form_data = array(
'name' => 'My first form'
);
$router = new Forms();
$response = $router->save(/* missing data */);
expect($response['result'])->false();
expect($response['errors'][0])->equals('You need to specify a name.');
$response = $router->save($form_data);
expect($response['result'])->true();
expect($response['form_id'] > 0)->true();
$form = Form::where('name', 'My first form')->findOne();
expect($form->id)->equals($response['form_id']);
expect($form->name)->equals('My first form');
}
function itCanPreviewAForm() {
$router = new Forms();
$response = $router->create();
expect($response['result'])->true();
expect($response['form_id'] > 0)->true();
$form = Form::findOne($response['form_id']);
$response = $router->previewEditor($form->asArray());
expect($response['html'])->notEmpty();
expect($response['css'])->notEmpty();
}
function itCanExportAForm() {
$router = new Forms();
$response = $router->create();
expect($response['result'])->true();
expect($response['form_id'] > 0)->true();
$response = $router->exportsEditor($response['form_id']);
expect($response['html'])->notEmpty();
expect($response['php'])->notEmpty();
expect($response['iframe'])->notEmpty();
expect($response['shortcode'])->notEmpty();
}
function itCanSaveFormEditor() {
$router = new Forms();
$response = $router->create();
expect($response['result'])->true();
expect($response['form_id'] > 0)->true();
$form = Form::findOne($response['form_id'])->asArray();
$form['name'] = 'Updated form';
$response = $router->saveEditor($form);
expect($response['result'])->true();
expect($response['is_widget'])->false();
$saved_form = Form::findOne($form['id']);
expect($saved_form->name)->equals('Updated form');
}
function itCanRestoreAForm() {
$form = Form::where('name', 'Form 1')->findOne();
$form->trash();
$trashed_form = Form::findOne($form->id);
expect($trashed_form->deleted_at)->notNull();
$router = new Forms();
$response = $router->restore($form->id);
expect($response)->true();
$restored_form = Form::findOne($form->id);
expect($restored_form->deleted_at)->null();
}
function itCanTrashAForm() {
$form = Form::where('name', 'Form 1')->findOne();
expect($form->deleted_at)->null();
$router = new Forms();
$response = $router->trash($form->id);
expect($response)->true();
$trashed_form = Form::findOne($form->id);
expect($trashed_form->deleted_at)->notNull();
}
function itCanDeleteAForm() {
$form = Form::where('name', 'Form 2')->findOne();
expect($form->deleted_at)->null();
$router = new Forms();
$response = $router->delete($form->id);
expect($response)->equals(1);
$deleted_form = Form::findOne($form->id);
expect($deleted_form)->false();
}
function itCanDuplicateAForm() {
$form = Form::where('name', 'Form 3')->findOne();
$router = new Forms();
$response = $router->duplicate($form->id);
expect($response['name'])->equals('Copy of '.$form->name);
$duplicated_form = Form::findOne($response['id']);
expect($duplicated_form->name)->equals('Copy of '.$form->name);
}
function _after() {
Form::deleteMany();
Segment::deleteMany();
}
}

View File

@ -0,0 +1,82 @@
<?php
use \MailPoet\Router\NewsletterTemplates;
use \MailPoet\Models\NewsletterTemplate;
class NewsletterTemplatesCest {
function _before() {
NewsletterTemplate::createOrUpdate(array(
'name' => 'Template #1',
'description' => 'My First Template',
'body' => '{"key1": "value1"}'
));
NewsletterTemplate::createOrUpdate(array(
'name' => 'Template #2',
'description' => 'My Second Template',
'body' => '{"key2": "value2"}'
));
}
function itCanGetANewsletterTemplate() {
$template = NewsletterTemplate::where('name', 'Template #1')->findOne();
$router = new NewsletterTemplates();
$response = $router->get(/* missing id */);
expect($response)->false();
$response = $router->get('not_an_id');
expect($response)->false();
$response = $router->get($template->id());
expect($response['name'])->equals('Template #1');
expect($response['body']['key1'])->equals('value1');
}
function itCanGetAllNewsletterTemplates() {
$templates = NewsletterTemplate::findArray();
$router = new NewsletterTemplates();
$response = $router->getAll();
expect($response)->count(2);
expect($response[0]['name'])->equals('Template #1');
expect($response[0]['body']['key1'])->equals('value1');
expect($response[1]['name'])->equals('Template #2');
expect($response[1]['body']['key2'])->equals('value2');
}
function itCanSaveANewsletterTemplate() {
$template_data = array(
'name' => 'Template #3',
'description' => 'My Third Template',
'body' => '{"key3": "value3"}'
);
$router = new NewsletterTemplates();
$response = $router->save($template_data);
expect($response)->true();
$template = NewsletterTemplate::where('name', 'Template #3')->findOne();
expect($template->name)->equals('Template #3');
expect($template->description)->equals('My Third Template');
expect($template->body)->equals('{"key3": "value3"}');
}
function itCanDeleteANewsletterTemplate() {
$template = NewsletterTemplate::where('name', 'Template #2')->findOne();
expect($template->deleted_at)->null();
$router = new NewsletterTemplates();
$response = $router->delete($template->id());
expect($response)->true();
$deleted_template = NewsletterTemplate::findOne($template->id());
expect($deleted_template)->false();
}
function _after() {
NewsletterTemplate::deleteMany();
}
}

View File

@ -0,0 +1,208 @@
<?php
use \MailPoet\Router\Newsletters;
use \MailPoet\Models\Newsletter;
use \MailPoet\Models\NewsletterSegment;
use \MailPoet\Models\NewsletterTemplate;
use \MailPoet\Models\Segment;
class NewslettersCest {
function _before() {
}
function itCanGetANewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$router = new Newsletters();
$response = $router->get($newsletter->id());
expect($response['id'])->equals($newsletter->id());
$response = $router->get('not_an_id');
expect($response)->false();
$response = $router->get(/* missing argument */);
expect($response)->false();
}
function itCanSaveANewNewsletter() {
$valid_data = array(
'subject' => 'My First Newsletter',
'type' => 'standard'
);
$router = new Newsletters();
$response = $router->save($valid_data);
expect($response['result'])->true();
expect($response)->hasntKey('errors');
$invalid_data = array(
'subject' => 'Missing newsletter type'
);
$response = $router->save($invalid_data);
expect($response['result'])->false();
expect($response['errors'][0])->equals('You need to specify a type.');
}
function itCanSaveAnExistingNewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$router = new Newsletters();
$newsletter_data = $newsletter->asArray();
$newsletter_data['subject'] = 'My Updated Newsletter';
$response = $router->save($newsletter_data);
expect($response['result'])->true();
$updated_newsletter = Newsletter::findOne($newsletter->id());
expect($updated_newsletter->subject)->equals('My Updated Newsletter');
}
function itCanRestoreANewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$newsletter->trash();
expect($newsletter->deleted_at)->notNull();
$router = new Newsletters();
$router->restore($newsletter->id());
$restored_subscriber = Newsletter::findOne($newsletter->id());
expect($restored_subscriber->deleted_at)->null();
}
function itCanTrashANewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$router = new Newsletters();
$response = $router->trash($newsletter->id());
expect($response)->true();
$trashed_subscriber = Newsletter::findOne($newsletter->id());
expect($trashed_subscriber->deleted_at)->notNull();
}
function itCanDeleteANewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$router = new Newsletters();
$response = $router->delete($newsletter->id());
expect($response)->equals(1);
expect(Newsletter::findOne($newsletter->id()))->false();
}
function itCanDuplicateANewsletter() {
$newsletter = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
expect($newsletter->id() > 0)->true();
$router = new Newsletters();
$response = $router->duplicate($newsletter->id());
expect($response['subject'])->equals('Copy of My First Newsletter');
expect($response['type'])->equals('standard');
expect($response['body'])->equals($newsletter->body);
}
function itCanCreateANewsletter() {
$data = array(
'subject' => 'My New Newsletter',
'type' => 'standard'
);
$router = new Newsletters();
$response = $router->create($data);
expect($response['result'])->true();
expect($response['newsletter']['id'] > 0)->true();
expect($response['newsletter']['subject'])->equals('My New Newsletter');
expect($response['newsletter']['type'])->equals('standard');
expect($response['newsletter']['body'])->equals(array());
expect($response)->hasntKey('errors');
$response = $router->create();
expect($response['result'])->false();
expect($response['errors'][0])->equals('You need to specify a type.');
}
function itCanGetListingData() {
$segment_1 = Segment::createOrUpdate(array('name' => 'Segment 1'));
$segment_2 = Segment::createOrUpdate(array('name' => 'Segment 2'));
$newsletter_1 = Newsletter::createOrUpdate(array(
'subject' => 'My First Newsletter',
'type' => 'standard'
));
$newsletter_2 = Newsletter::createOrUpdate(array(
'subject' => 'My Second Newsletter',
'type' => 'standard'
));
$newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array(
'newsletter_id' => $newsletter_1->id(),
'segment_id' => $segment_1->id()
));
$newsletter_segment->save();
$newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array(
'newsletter_id' => $newsletter_1->id(),
'segment_id' => $segment_2->id()
));
$newsletter_segment->save();
$newsletter_segment = NewsletterSegment::create();
$newsletter_segment->hydrate(array(
'newsletter_id' => $newsletter_2->id(),
'segment_id' => $segment_2->id()
));
$newsletter_segment->save();
$router = new Newsletters();
$response = $router->listing(array('sort'));
expect($response)->hasKey('filters');
expect($response)->hasKey('groups');
expect($response['count'])->equals(2);
expect($response['items'])->count(2);
expect($response['items'][0]['subject'])->equals('My First Newsletter');
expect($response['items'][1]['subject'])->equals('My Second Newsletter');
expect($response['items'][0]['segments'])->equals(array(
$segment_1->id(),
$segment_2->id()
));
expect($response['items'][1]['segments'])->equals(array(
$segment_2->id()
));
}
function _after() {
Newsletter::deleteMany();
Segment::deleteMany();
}
}

View File

@ -0,0 +1,111 @@
<?php
use \MailPoet\Router\Segments;
use \MailPoet\Models\Segment;
class SegmentsCest {
function _before() {
Segment::createOrUpdate(array('name' => 'Segment 1'));
Segment::createOrUpdate(array('name' => 'Segment 2'));
Segment::createOrUpdate(array('name' => 'Segment 3'));
}
function itCanGetASegment() {
$segment = Segment::where('name', 'Segment 1')->findOne();
$router = new Segments();
$response = $router->get(/* missing id */);
expect($response)->false();
$response = $router->get('not_an_id');
expect($response)->false();
$response = $router->get($segment->id());
expect($response['name'])->equals($segment->name);
}
function itCanGetListingData() {
$router = new Segments();
$response = $router->listing();
expect($response)->hasKey('filters');
expect($response)->hasKey('groups');
expect($response['count'])->equals(3);
expect($response['items'])->count(3);
expect($response['items'][0]['name'])->equals('Segment 1');
expect($response['items'][1]['name'])->equals('Segment 2');
expect($response['items'][2]['name'])->equals('Segment 3');
}
function itCanSaveASegment() {
$segment_data = array(
'name' => 'New Segment'
);
$router = new Segments();
$response = $router->save(/* missing data */);
expect($response['result'])->false();
expect($response['errors'][0])->equals('You need to specify a name.');
$response = $router->save($segment_data);
expect($response['result'])->true();
$segment = Segment::where('name', 'New Segment')->findOne();
expect($segment->name)->equals($segment_data['name']);
}
function itCanRestoreASegment() {
$segment = Segment::where('name', 'Segment 1')->findOne();
$segment->trash();
$trashed_segment = Segment::findOne($segment->id());
expect($trashed_segment->deleted_at)->notNull();
$router = new Segments();
$response = $router->restore($segment->id());
expect($response)->true();
$restored_segment = Segment::findOne($segment->id());
expect($restored_segment->deleted_at)->null();
}
function itCanTrashASegment() {
$segment = Segment::where('name', 'Segment 1')->findOne();
expect($segment->deleted_at)->null();
$router = new Segments();
$response = $router->trash($segment->id());
expect($response)->true();
$trashed_segment = Segment::findOne($segment->id());
expect($trashed_segment->deleted_at)->notNull();
}
function itCanDeleteASegment() {
$segment = Segment::where('name', 'Segment 2')->findOne();
expect($segment->deleted_at)->null();
$router = new Segments();
$response = $router->delete($segment->id());
expect($response)->equals(1);
$deleted_segment = Segment::findOne($segment->id());
expect($deleted_segment)->false();
}
function itCanDuplicateASegment() {
$segment = Segment::where('name', 'Segment 3')->findOne();
$router = new Segments();
$response = $router->duplicate($segment->id());
expect($response['name'])->equals('Copy of '.$segment->name);
$duplicated_segment = Segment::findOne($response['id']);
expect($duplicated_segment->name)->equals('Copy of '.$segment->name);
}
function _after() {
ORM::forTable(Segment::$_table)->deleteMany();
}
}

View File

@ -0,0 +1,50 @@
<?php
use \MailPoet\Router\Settings;
use \MailPoet\Models\Setting;
class SettingsCest {
function _before() {
Setting::setValue('some.setting.key', true);
}
function itCanGetSettings() {
$router = new Settings();
$settings = $router->get();
expect($settings)->notEmpty();
expect($settings['some']['setting']['key'])->true();
Setting::deleteMany();
$settings = $router->get();
expect($settings)->isEmpty();
}
function itCanSetSettings() {
$new_settings = array(
'some' => array(
'setting' => array(
'new_key' => true
),
'new_setting' => true
)
);
$router = new Settings();
$response = $router->set(/* missing data */);
expect($response)->false();
$response = $router->set($new_settings);
expect($response)->true();
$settings = $router->get();
expect($settings['some']['setting'])->hasntKey('key');
expect($settings['some']['setting']['new_key'])->true();
expect($settings['some']['new_setting'])->true();
}
function _after() {
ORM::forTable(Setting::$_table)->deleteMany();
}
}

View File

@ -0,0 +1,22 @@
<?php
use \MailPoet\Router\Setup;
use \MailPoet\Models\Setting;
class SetupCest {
function _before() {
Setting::setValue('signup_confirmation.enabled', false);
}
function itCanReinstall() {
/*$router = new Setup();
$response = $router->reset();
expect($response['result'])->true();
$signup_confirmation = Setting::getValue('signup_confirmation.enabled');
expect($signup_confirmation)->true();*/
}
function _after() {
Setting::deleteMany();
}
}

View File

@ -6,7 +6,6 @@ use \MailPoet\Models\Segment;
class SubscribersCest {
function _before() {
}
function itCanGetASubscriber() {
@ -17,31 +16,16 @@ class SubscribersCest {
$router = new Subscribers();
$response = $router->get(array('id' => $subscriber->id()));
$response = $router->get($subscriber->id());
expect($response['id'])->equals($subscriber->id());
$response = $router->get(array('id' => 'not_an_id'));
$response = $router->get('not_an_id');
expect($response)->false();
$response = $router->get(/* missing argument */);
expect($response)->false();
}
function itCanGetAllSubscribers(UnitTester $I) {
$I->generateSubscribers(10);
$router = new Subscribers();
$result = $router->getAll();
expect($result)->count(10);
$model = Subscriber::create();
foreach($result as $subscriber) {
expect($subscriber['id'] > 0)->true();
expect($subscriber['email'])->notEmpty();
}
}
function itCanSaveANewSubscriber() {
$valid_data = array(
'email' => 'john.doe@mailpoet.com',
@ -50,9 +34,13 @@ class SubscribersCest {
);
$router = new Subscribers();
$response = $router->save($valid_data);
expect($response['result'])->true();
expect($response)->hasntKey('errors');
$response = $router->save(/* missing data */);
expect($response['result'])->false();
expect($response['errors'][0])->equals('You need to enter your email address.');
$invalid_data = array(
'email' => 'john.doe@invalid',

View File

@ -8,67 +8,76 @@ use MailPoet\Subscribers\ImportExport\BootStrapMenu;
class BootStrapMenuCest {
function _before() {
$this->segmentsData = array(
array(
'name' => 'first',
'description' => 'some description'
),
array(
'name' => 'second',
'description' => 'some description'
)
);
$this->subscribersData = array(
array(
'first_name' => 'John',
'last_name' => 'Mailer',
'status' => 'unconfirmed',
'email' => 'john@mailpoet.com'
),
array(
'first_name' => 'Mike',
'last_name' => 'Smith',
'status' => 'subscribed',
'email' => 'mike@maipoet.com'
)
);
$this->customFieldsData = array(
'name' => 'DOB',
'type' => 'date',
);
$customField = CustomField::create();
$customField->hydrate($this->customFieldsData);
$customField->save();
$segment_1 = Segment::createOrUpdate(array('name' => 'Unconfirmed Segment'));
$segment_2 = Segment::createOrUpdate(array('name' => 'Confirmed Segment'));
$subscriber_1 = Subscriber::createOrUpdate(array(
'first_name' => 'John',
'last_name' => 'Mailer',
'status' => 'unconfirmed',
'email' => 'john@mailpoet.com'
));
$subscriber_2 = Subscriber::createOrUpdate(array(
'first_name' => 'Mike',
'last_name' => 'Smith',
'status' => 'subscribed',
'email' => 'mike@maipoet.com'
));
$association = SubscriberSegment::create();
$association->subscriber_id = $subscriber_1->id;
$association->segment_id = $segment_1->id;
$association->save();
$association = SubscriberSegment::create();
$association->subscriber_id = $subscriber_2->id;
$association->segment_id = $segment_2->id;
$association->save();
CustomField::createOrUpdate(array(
'name' => 'Birthday',
'type' => 'date'
));
$this->bootStrapImportMenu = new BootStrapMenu('import');
$this->bootStrapExportMenu = new BootStrapMenu('export');
}
function itCanGetSegmentsWithSubscriberCount() {
// TOFIX.
/*$this->_createSegmentsAndSubscribers();
$segments = $this->bootStrapImportMenu->getSegments();
expect(count($segments))->equals(2);
expect($segments[0]['name'])->equals($this->segmentsData[0]['name']);
expect($segments[0]['name'])->equals('Unconfirmed Segment');
expect($segments[0]['subscriberCount'])->equals(1);
expect($segments[1]['subscriberCount'])->equals(1);*/
expect($segments[1]['name'])->equals('Confirmed Segment');
expect($segments[1]['subscriberCount'])->equals(1);
}
function itCanGetSegmentsForImportWithoutTrashedSubscribers() {
$this->_createSegmentsAndSubscribers();
function itCanGetPublicSegmentsForImport() {
$segments = $this->bootStrapImportMenu->getSegments();
expect(count($segments))->equals(2);
$subscriber = Subscriber::findOne(1);
$subscriber->deleted_at = date('Y-m-d H:i:s');
$subscriber->save();
$subscriber = Subscriber::where(
'email', 'john@mailpoet.com'
)->findOne();
expect($subscriber->deleted_at)->null();
$subscriber->trash();
$subscriber = Subscriber::where(
'email', 'john@mailpoet.com'
)->whereNull('deleted_at')->findOne();
expect($subscriber)->false();
$segments = $this->bootStrapImportMenu->getSegments();
expect(count($segments))->equals(1);
}
function itCanGetSegmentsForExportWithoutTrashedSubscribers() {
$this->_createSegmentsAndSubscribers();
function itCanGetPublicSegmentsForExport() {
$segments = $this->bootStrapExportMenu->getSegments();
expect(count($segments))->equals(2);
$subscriber = Subscriber::findOne(1);
$subscriber = Subscriber::where('email', 'john@mailpoet.com')
->findOne();
$subscriber->deleted_at = date('Y-m-d H:i:s');
$subscriber->save();
$segments = $this->bootStrapExportMenu->getSegments();
@ -76,21 +85,21 @@ class BootStrapMenuCest {
}
function itCanGetSegmentsForExport() {
$this->_createSegmentsAndSubscribers();
$segments = $this->bootStrapExportMenu->getSegments();
expect(count($segments))->equals(2);
expect($segments[0]['name'])->equals($this->segmentsData[0]['name']);
expect($segments[0]['name'])->equals('Confirmed Segment');
expect($segments[0]['subscriberCount'])->equals(1);
expect($segments[1]['name'])->equals('Unconfirmed Segment');
expect($segments[1]['subscriberCount'])->equals(1);
}
function itCanGetSegmentsWithConfirmedSubscribersForExport() {
$this->_createSegmentsAndSubscribers();
$segments = $this->bootStrapExportMenu->getSegments(
$withConfirmedSubscribers = true
);
expect(count($segments))->equals(1);
expect($segments[0]['name'])->equals($this->segmentsData[1]['name']);
expect($segments[0]['name'])->equals('Confirmed Segment');
}
function itCanGetSubscriberFields() {
@ -101,7 +110,7 @@ class BootStrapMenuCest {
'last_name',
'status'
);
foreach ($fields as $field) {
foreach($fields as $field) {
expect(in_array($field, array_keys($subsriberFields)))->true();
}
}
@ -117,7 +126,7 @@ class BootStrapMenuCest {
'type',
'custom'
);
foreach ($fields as $field) {
foreach($fields as $field) {
expect(in_array($field, array_keys($formattedSubscriberFields[0])))
->true();
}
@ -129,7 +138,7 @@ class BootStrapMenuCest {
$this->bootStrapImportMenu
->getSubscriberCustomFields();
expect($subscriberCustomFields[0]['type'])
->equals($this->customFieldsData['type']);
->equals('date');
}
function itCanFormatSubsciberCustomFields() {
@ -143,7 +152,7 @@ class BootStrapMenuCest {
'type',
'custom'
);
foreach ($fields as $field) {
foreach($fields as $field) {
expect(in_array($field, array_keys($formattedSubscriberCustomFields[0])))
->true();
}
@ -241,10 +250,6 @@ class BootStrapMenuCest {
}
function itCanBootStrapImport() {
$customField = CustomField::create();
$customField->hydrate($this->customFieldsData);
$customField->save();
$this->_createSegmentsAndSubscribers();
$import = clone($this->bootStrapImportMenu);
$importMenu = $import->bootstrap();
expect(count(json_decode($importMenu['segments'], true)))
@ -257,15 +262,11 @@ class BootStrapMenuCest {
->equals(3);
expect($importMenu['maxPostSize'])->equals(ini_get('post_max_size'));
expect($importMenu['maxPostSizeBytes'])->equals(
(int) ini_get('post_max_size') * 1048576
(int)ini_get('post_max_size') * 1048576
);
}
function itCanBootStrapExport() {
$customField = CustomField::create();
$customField->hydrate($this->customFieldsData);
$customField->save();
$this->_createSegmentsAndSubscribers();
$export = clone($this->bootStrapImportMenu);
$exportMenu = $export->bootstrap();
expect(count(json_decode($exportMenu['segments'], true)))
@ -275,27 +276,10 @@ class BootStrapMenuCest {
->equals(3);
}
function _createSegmentsAndSubscribers() {
foreach ($this->segmentsData as $segmentData) {
$segment = Segment::create();
$segment->hydrate($segmentData);
$segment->save();
}
foreach ($this->subscribersData as $subscriberData) {
$subscriber = Subscriber::create();
$subscriber->hydrate($subscriberData);
$subscriber->save();
$association = SubscriberSegment::create();
$association->subscriber_id = $subscriber->id;
$association->segment_id = $subscriber->id;
$association->save();
};
}
function _after() {
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
ORM::raw_execute('TRUNCATE ' . Segment::$_table);
ORM::raw_execute('TRUNCATE ' . SubscriberSegment::$_table);
ORM::raw_execute('TRUNCATE ' . CustomField::$_table);
Subscriber::deleteMany();
Segment::deleteMany();
SubscriberSegment::deleteMany();
CustomField::deleteMany();
}
}

View File

@ -146,7 +146,7 @@ class ExportCest {
expect($target)->equals(array($source->id => $source->name));
}
function itCanFormatsubscriber_fields() {
function itCanFormatSubscriberFields() {
$formatted_subscriber_fields = $this->export->formatSubscriberFields(
array_keys($this->subscriber_fields),
$this->export->getSubscriberCustomFields()

View File

@ -4,12 +4,16 @@ use MailPoet\Subscribers\ImportExport\Import\MailChimp;
class MailChimpCest {
function __construct() {
$this->APIKey = 'd91ae3861c4829c40bd469e40d6c0e7e-us6';
$this->APIKey = getenv('WP_TEST_IMPORT_MAILCHIMP_API') ?
getenv('WP_TEST_IMPORT_MAILCHIMP_API') :
'1234567890';
$this->mailChimp = new MailChimp($this->APIKey);
$this->lists = array(
'edf74586e9',
'8b66f7fac8'
);
$this->lists = getenv('WP_TEST_IMPORT_MAILCHIMP_LISTS') ?
explode(",", getenv('WP_TEST_IMPORT_MAILCHIMP_LISTS')) :
array(
'one',
'two'
);
}
function itCanGetAPIKey() {
@ -24,6 +28,7 @@ class MailChimpCest {
}
function itFailsWithIncorrectAPIKey() {
if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return;
$mailChimp = clone($this->mailChimp);
$mailChimp->APIKey = false;
$lists = $mailChimp->getLists();
@ -43,6 +48,7 @@ class MailChimpCest {
}
function itFailsWithIncorrectLists() {
if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return;
$subscribers = $this->mailChimp->getSubscribers();
expect($subscribers['result'])->false();
expect($subscribers['error'])->contains('lists');
@ -52,6 +58,7 @@ class MailChimpCest {
}
function itCanGetSubscribers() {
if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return;
$subscribers = $this->mailChimp->getSubscribers(array($this->lists[0]));
expect($subscribers['result'])->true();
expect(isset($subscribers['data']['invalid']))->true();
@ -62,15 +69,17 @@ class MailChimpCest {
}
function itFailsWhenListHeadersDontMatch() {
if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return;
$subscribers = $this->mailChimp->getSubscribers($this->lists);
expect($subscribers['result'])->false();
expect($subscribers['error'])->contains('header');
}
function itFailWhenSubscribersDataTooLarge() {
function itFailsWhenSubscribersDataTooLarge() {
if(getenv('WP_TEST_ENABLE_NETWORK_TESTS') !== 'true') return;
$mailChimp = clone($this->mailChimp);
$mailChimp->maxPostSize = 10;
$subscribers = $mailChimp->getSubscribers(array('8b66f7fac8'));
$subscribers = $mailChimp->getSubscribers($this->lists);
expect($subscribers['result'])->false();
expect($subscribers['error'])->contains('large');
}

View File

@ -438,10 +438,15 @@
action: 'saveEditor',
data: form
}).done(function(response) {
if(response === false) {
MailPoet.Notice.error(
"<%= __('An error occured, please reload the page and try again.') %>"
);
if(response.result === false) {
if(response.errors.length > 0) {
MailPoet.Notice.error(response.errors.join('<br />'));
} else {
MailPoet.Notice.error(
"<%= __('An error occured, please reload the page and try again.') %>"
);
}
return false;
}

View File

@ -12,5 +12,8 @@
<script type="text/javascript">
var mailpoet_segments = <%= json_encode(segments) %>;
var mailpoet_form_edit_url =
"<%= admin_url('admin.php?page=mailpoet-form-editor&id=') %>";
</script>
<% endblock %>

View File

@ -1269,9 +1269,7 @@
MailPoet.Ajax.post({
endpoint: 'newsletters',
action: 'get',
data: {
id: <%= params('id') %>
}
data: <%= params('id') %>
}).done(function(newsletter) {
// start editor
editor = EditorApplication.start({

View File

@ -1,7 +1,7 @@
{{#if tools.layerSelector}}<a href="javascript:;" class="mailpoet_tool mailpoet_newsletter_layer_selector" title="<%= __('Switch editing layer') %>">
{{#if tools.layerSelector}}<a href="javascript:;" class="mailpoet_tool mailpoet_newsletter_layer_selector mailpoet_ignore_drag" title="<%= __('Switch editing layer') %>">
<%= source('newsletter/templates/svg/block-tools/settings-column.svg') %>
</a>{{/if}}{{#if tools.settings}}<a href="javascript:;" class="mailpoet_tool mailpoet_edit_block" title="<%= __('Edit settings') %>">
</a>{{/if}}{{#if tools.settings}}<a href="javascript:;" class="mailpoet_tool mailpoet_edit_block mailpoet_ignore_drag" title="<%= __('Edit settings') %>">
<%= source('newsletter/templates/svg/block-tools/settings.svg') %>
</a>{{/if}}{{#if tools.delete}}<div class="mailpoet_delete_block"><a href="javascript:;" class="mailpoet_tool mailpoet_delete_block_activate" title="<%= __('Delete') %>"><%= source('newsletter/templates/svg/block-tools/trash.svg') %></a><a href="javascript:;" class="mailpoet_delete_block_confirm" title="<%= __('Confirm deletion') %>"><%= __('Delete') %></a><a href="javascript:;" class="mailpoet_delete_block_cancel" title="<%= __('Cancel deletion') %>"><%= __('Cancel') %></a></div>{{/if}}{{#if tools.move}}<a href="javascript:;" class="mailpoet_tool mailpoet_move_block" title="<%= __('Drag to move') %>">
</a>{{/if}}{{#if tools.delete}}<div class="mailpoet_delete_block mailpoet_ignore_drag"><a href="javascript:;" class="mailpoet_tool mailpoet_delete_block_activate" title="<%= __('Delete') %>"><%= source('newsletter/templates/svg/block-tools/trash.svg') %></a><a href="javascript:;" class="mailpoet_delete_block_confirm" title="<%= __('Confirm deletion') %>"><%= __('Delete') %></a><a href="javascript:;" class="mailpoet_delete_block_cancel" title="<%= __('Cancel deletion') %>"><%= __('Cancel') %></a></div>{{/if}}{{#if tools.move}}<a href="javascript:;" class="mailpoet_tool mailpoet_move_block" title="<%= __('Drag to move') %>">
<%= source('newsletter/templates/svg/block-tools/move.svg') %>
</a>{{/if}}

View File

@ -766,7 +766,12 @@
if(response.result === true) {
MailPoet.Notice.success("The email has been sent! Check your inbox.");
} else {
MailPoet.Notice.error("The email could not be sent. Please check your settings.");
if (response.errors) {
MailPoet.Notice.error("The email could not be sent. " + response.errors);
}
else {
MailPoet.Notice.error("The email could not be sent. Please check your settings.");
}
}
});
});