/**
  * Resets the database.
  *
  * @since  1.0.0
  */
 public static function reset()
 {
     global $wpdb;
     // wipe all existing data.
     $wpdb->query("TRUNCATE TABLE {$wpdb->users};");
     $wpdb->query("TRUNCATE TABLE {$wpdb->usermeta};");
     $wpdb->query("TRUNCATE TABLE {$wpdb->posts};");
     $wpdb->query("TRUNCATE TABLE {$wpdb->postmeta};");
     $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '%transient_%';");
     $wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE 'MS_%';");
     self::$ids = array('user' => array(), 'post' => array(), 'membership' => array());
     // create demo users
     $users = array('admin' => array('role' => 'administrator'), 'editor' => array('role' => 'editor'));
     foreach ($users as $login => $data) {
         $defaults = array('user_login' => $login, 'user_pass' => $login . '-password', 'user_email' => $login . '@local.dev', 'role' => 'subscriber', 'user_nicename' => '', 'user_url' => '', 'display_name' => 'User ' . $login, 'nickname' => '', 'first_name' => '', 'last_name' => '', 'description' => '', 'user_registered' => '');
         $data = shortcode_atts($defaults, $data);
         $id = wp_insert_user($data);
         if (!empty($data['meta'])) {
             foreach ($data['meta'] as $key => $val) {
                 $val = maybe_serialize($val);
                 update_user_meta($id, $key, $val);
             }
         }
         self::$ids['user'][$login] = $id;
     }
     // create demo posts
     $posts = array('sample-post' => array('post_content' => 'Just a very simple sample post...'), 'sample-page' => array('post_type' => 'page', 'post_content' => 'Just a very simple sample page...'));
     foreach ($posts as $slug => $data) {
         $defaults = array('post_type' => 'post', 'post_author' => self::id('user', 'admin'), 'post_title' => $slug, 'post_name' => $slug);
         $data = shortcode_atts($defaults, $data);
         $id = wp_insert_post($data);
         if (!empty($data['meta'])) {
             foreach ($data['meta'] as $key => $val) {
                 $val = maybe_serialize($val);
                 update_post_meta($id, $key, $val);
             }
         }
         self::$ids['post'][$slug] = $id;
     }
     // create demo memberships
     $memberships = array('simple' => array('name' => 'Simple Membership', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_PERMANENT, 'price' => 29, 'rule_values' => array()), 'simple-free' => array('name' => 'Simple Membership', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_PERMANENT, 'is_free' => true, 'price' => 0, 'rule_values' => array()), 'simple-trial' => array('name' => 'Simple Membership with Trial', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_PERMANENT, 'price' => 29, 'rule_values' => array(), 'trial_period_enabled' => true, 'trial_period' => array('period_unit' => 14, 'period_type' => 'days')), 'limited' => array('name' => 'Limited Membership', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_FINITE, 'price' => 19, 'rule_values' => array(), 'period' => array('period_unit' => 28, 'period_type' => 'days')), 'limited-trial' => array('name' => 'Limited Membership with Trial', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_FINITE, 'price' => 19, 'rule_values' => array(), 'period' => array('period_unit' => 28, 'period_type' => 'days'), 'trial_period_enabled' => true, 'trial_period' => array('period_unit' => 14, 'period_type' => 'days')), 'daterange-trial' => array('name' => 'Date-Range Membership with Trial', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_DATE_RANGE, 'price' => 39, 'rule_values' => array(), 'period_date_start' => date('Y-m-d', time() + self::ONE_DAY), 'period_date_end' => date('Y-m-d', time() + 10 * self::ONE_DAY), 'trial_period_enabled' => true, 'trial_period' => array('period_unit' => 14, 'period_type' => 'days')), 'free-limited' => array('name' => 'Free Limited Membership', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_FINITE, 'is_free' => true, 'price' => 0, 'rule_values' => array(), 'period' => array('period_unit' => 28, 'period_type' => 'days')), 'recurring' => array('name' => 'Unit-Test Recurring', 'type' => MS_Model_Membership::TYPE_STANDARD, 'payment_type' => MS_Model_Membership::PAYMENT_TYPE_RECURRING, 'is_free' => false, 'price' => 4, 'rule_values' => array(), 'pay_cycle_period' => array('period_unit' => 7, 'period_type' => 'days'), 'pay_cycle_repetitions' => 2));
     foreach ($memberships as $key => $data) {
         $item = new MS_Model_Membership();
         foreach ($data as $prop => $val) {
             if (!property_exists($item, $prop)) {
                 continue;
             }
             $item->{$prop} = $val;
         }
         $item->save();
         $id = $item->id;
         self::$ids['membership'][$key] = $id;
     }
     // Prepare Payment Gateways.
     $gateway = MS_Model_Gateway::factory(MS_Gateway_Stripe::ID);
     $gateway->mode = MS_Gateway::MODE_SANDBOX;
     $gateway->active = true;
     $gateway->test_secret_key = 'sk_test_MSKvYHhIm3kKNr4tshnZHIEk';
     $gateway->test_publishable_key = 'pk_test_h8fk0CAW287ToA3o6aeehThB';
     $gateway->save();
     $gateway = MS_Model_Gateway::factory(MS_Gateway_Stripeplan::ID);
     $gateway->mode = MS_Gateway::MODE_SANDBOX;
     $gateway->active = true;
     $gateway->test_secret_key = 'sk_test_MSKvYHhIm3kKNr4tshnZHIEk';
     $gateway->test_publishable_key = 'pk_test_h8fk0CAW287ToA3o6aeehThB';
     $gateway->save();
     // Clear the plugin Factory-Cache
     MS_Factory::_reset();
 }