Example #1
0
 /**
  * Test that the wp_ID column gets added to groups via the 1.1.0 updater
  *
  * @since 1.1.0
  *
  * @group db
  *
  * @covers \ingot\testing\db\add_wp_id_column()
  * @covers \ingot\testing\db\run()
  */
 public function test1dot1Update()
 {
     global $wpdb;
     $table_name = \ingot\testing\crud\group::get_table_name();
     //test method in isolation
     $wpdb->query(sprintf('ALTER TABLE %s DROP COLUMN wp_ID', $table_name));
     $updater = new \ingot\testing\db\upgrade('1.1.0');
     $updater->add_wp_id_column();
     $data = ingot_test_data_price::edd_tests(10);
     $this->assertTrue(is_array($data));
     $this->assertTrue(is_numeric($data['group_ID']));
     $product_ID = $data['product_ID'];
     $results = $wpdb->query(sprintf('SELECT * FROM `%s` WHERE `wp_ID` = %d', $table_name, $product_ID));
     $this->assertTrue(!empty($results));
     //test using run method
     $wpdb->query(sprintf('ALTER TABLE %s DROP COLUMN wp_ID', $table_name));
     $updater->run();
     $data = ingot_test_data_price::edd_tests(10);
     $this->assertTrue(is_array($data));
     $this->assertTrue(is_numeric($data['group_ID']));
     $product_ID = $data['product_ID'];
     $results = $wpdb->query(sprintf('SELECT * FROM `%s` WHERE `wp_ID` = %d', $table_name, $product_ID));
     $this->assertTrue(!empty($results));
     //test that running it anyway doesn't break stuff
     $results = $wpdb->query(sprintf('SELECT * FROM `%s` WHERE `wp_ID` = %d', $table_name, $product_ID));
     $this->assertTrue(!empty($results));
 }
Example #2
0
 public static function current_sequence($group, $what = 'click')
 {
     if (!is_array($group)) {
         $group = group::read($group);
     }
     return helpers::v('current_sequence', $group, array());
 }
Example #3
0
 /**
  * Do query
  *
  * @since 1.1.0
  *
  * @access protected
  *
  * @param $wpdb
  * @param $sql
  *
  * @return array
  */
 protected static function query($wpdb, $sql)
 {
     $results = $wpdb->get_results($sql, ARRAY_A);
     if (is_array($results)) {
         return group::bulk_results($results);
     }
     return [];
 }
 /**
  * Print the content for the modal
  *
  * @uses "admin_footer"
  *
  * @since 1.1.0
  */
 public static function modal()
 {
     $screen = get_current_screen();
     if ($screen->base === 'post') {
         $groups = group::get_items(['type' => 'click']);
         echo admin::get_partial('shortcode-modal.php', ['groups' => $groups]);
     }
 }
Example #5
0
 /**
  * Check if session has been used
  *
  * @since 0.3.0
  *
  * @param \WP_REST_Request $request Full data about the request.
  *
  * @return \WP_Error|\WP_REST_Response
  */
 public function session($request)
 {
     $session = $this->get_session_by_url_params($request);
     if (ingot_is_no_testing_mode()) {
         $data['ingot_ID'] = $session['ingot_ID'];
         $data['tests'] = [];
         $data['session_ID'] = $session['ID'];
         return $data;
     }
     $tests = [];
     if (!is_array($session)) {
         return $session;
     } else {
         if (\ingot\testing\crud\session::is_used($session['ID'])) {
             $new_session_args = [];
             if (0 != $request->get_param('ingot_id')) {
                 $new_session_args['ingot_ID'] = $request->get_param('ingot_id');
             } elseif (0 < absint($session['ingot_ID'])) {
                 $new_session_args['ingot_ID'] = $session['ingot_ID'];
             }
             if (0 != get_current_user_id()) {
                 $new_session_args['uID'] = get_current_user_id();
             }
             $data['session_ID'] = \ingot\testing\crud\session::create($new_session_args, true);
             if (is_numeric($data['session_ID'])) {
                 $session = \ingot\testing\crud\session::read((int) $data['session_ID']);
                 if (!empty($request->get_param('test_ids'))) {
                     foreach ($request->get_param('test_ids') as $variant_id) {
                         $html = '';
                         if (is_array($group = group::get_by_variant_id($variant_id))) {
                             $html = ingot_click_test($group);
                         }
                         $tests[] = ['html' => $html, 'ID' => $variant_id];
                     }
                 }
             }
         } else {
             \ingot\testing\crud\session::mark_used($session['ID']);
             $data['session_ID'] = $session['ID'];
         }
         $data['ingot_ID'] = $session['ingot_ID'];
         $data['tests'] = $tests;
         return rest_ensure_response($data);
     }
 }
Example #6
0
 /**
  * Prepare price test details needed for use in cookies/tracking
  *
  * @since 0.2.0
  *
  * @param array $price_test Price test config
  * @param string $a_or_b a|b
  * @param int $sequence_id Sequence ID
  * @param int $group_id Group ID
  *
  * @return array
  */
 public static function price_detail($price_test, $a_or_b, $sequence_id, $group_id)
 {
     if (is_numeric($price_test)) {
         $price_test = price_test::read($price_test);
     }
     if (is_numeric($group_id)) {
         $group = group::read($group_id);
     } elseif (is_array($group_id)) {
         $group = $group_id;
         $group_id = helpers::v('ID', $group, 0);
     } else {
         return array();
     }
     if (!is_array($price_test) || !is_array($group)) {
         return array();
     }
     $details = array('plugin' => $group['plugin'], 'product_ID' => $price_test['product_ID'], 'test_ID' => $price_test['ID'], 'sequence_ID' => $sequence_id, 'group_ID' => $group_id, 'a_or_b' => $a_or_b);
     return $details;
 }
Example #7
0
 /**
  * Get total itterations and possible conversions for a group
  *
  * @since 1.1.0
  *
  * @param array  $group Group config array
  * @param bool $return_conversions Optional. To count conversions as well. Default is false
  *
  * @return array|int Total iterations as an integer or both iterations and conversions in an array
  */
 public static function get_total(array $group, $return_conversions = false)
 {
     $total = $conversions = 0;
     if (\ingot\testing\crud\group::valid($group)) {
         $levers = helpers::v('levers', $group, []);
         if (!empty($levers)) {
             foreach ($levers[$group['ID']] as $lever) {
                 if (is_object($lever) && method_exists($lever, 'getDenominator')) {
                     $total += $lever->getDenominator();
                     if ($return_conversions) {
                         $conversions += $lever->getNumerator();
                     }
                 }
             }
         }
     }
     if (!$return_conversions) {
         return $total;
     } else {
         return ['total' => $total, 'conversion' => $conversions];
     }
 }
/**
 * Get HTML for our test. Use this function to output the test.
 *
 * Note that because this function has the same name as the test sub_type we registered, it can be called by the Ingot shortcode.
 *
 * @return string
 */
function my_custom_banner()
{
    //check if is bot
    $is_bot = ingot_is_bot();
    $variant = [];
    //if cookie isset get variant without registering as a new test instance
    if (!$is_bot && isset($_COOKIE['my_ingot_custom_test_variant']) && 0 < absint($_COOKIE['my_ingot_custom_test_variant'])) {
        $variant_id = absint($_COOKIE['my_ingot_custom_test_variant']);
        $variant = \ingot\testing\crud\variant::read($variant_id);
    } elseif (!$is_bot && isset($my_custom_test_variant_id) && 0 < absint($my_custom_test_variant_id)) {
        //if is same session as cookie was set, we use the global variable to get the ID
        $variant_id = absint($my_custom_test_variant_id);
        $variant = \ingot\testing\crud\variant::read($variant_id);
    } else {
        //this should never be reached unless this is a bot, the cookie should have been set at template_redirect
        //We still need to show something since we want crawlers to index the site properly and false postives on bot checks to look right.
        $id = my_ingot_custom_test_group();
        if (is_numeric($id)) {
            $group = \ingot\testing\crud\group::read($id);
            if (is_array($group) && isset($group['variants']) && !empty($group['variants'])) {
                $variant = array_rand($group['variants']);
                //set up test and select a variant
                $test = new \ingot\testing\bandit\content($id);
                $variant_id = $test->choose();
                //a test instance is now registered
                $variant = \ingot\testing\crud\variant::read($variant_id);
            }
        }
    }
    //get chosen image URL and return it in an image tag
    if (isset($variant['content'])) {
        $content = $variant['content'];
    } else {
        //something is very wrong, let's show a picture of a cat in a flower pot
        $content = 'http://hellogiggles.com/wp-content/uploads/2014/07/22/you-popular-cute-cat-the-very-creative_113506.jpg';
    }
    return sprintf('<img src="%s" />', esc_url($content));
}
Example #9
0
 /**
  * Create groups with variants, optionally added to them.
  *
  * @param bool $add_variants Optional. If true, the default, variants are added to groups via groups object. If false, they are created, IDs are returned but they will nto be associated with a group properly.
  * @param int $total_groups Optional. Default is 5.
  * @param int $variants_per_group Optional. Default is 3.
  * @param array $args Optional
  *
  * @return array
  */
 public static function make_groups($add_variants = true, $total_groups = 5, $variants_per_group = 3, $args = array())
 {
     $defaults = ['group_args' => ['name' => rand(), 'type' => 'click', 'sub_type' => 'button', 'meta' => ['link' => 'https://bats.com']], 'variant_args' => ['type' => 'click', 'group_ID' => 1, 'content' => rand()]];
     $keys = array_keys($defaults);
     foreach ($keys as $i => $key) {
         if (!empty($args[$key])) {
             $args[$key] = wp_parse_args($args[$key], $defaults[$key]);
         } else {
             $args[$key] = $defaults[$key];
         }
     }
     $groups = ['ids' => [], 'variants' => []];
     $group_args = $args['group_args'];
     $variant_args = $args['variant_args'];
     for ($g = 0; $g <= $total_groups; $g++) {
         $variants = [];
         $group_args['name'] = (string) $g . rand();
         $group_id = \ingot\testing\crud\group::create($group_args, true);
         $groups['ids'][] = $group_id;
         $variant_args['group_ID'] = $group_id;
         for ($v = 0; $v <= $variants_per_group; $v++) {
             $variant_id = \ingot\testing\crud\variant::create($variant_args, true);
             $variants[] = $variant_id;
         }
         $groups['variants'][$group_id] = $variants;
         if ($add_variants) {
             if (is_user_logged_in()) {
                 $obj = new \ingot\testing\object\group($group_id);
                 $obj->update_group(['variants' => $variants]);
             } else {
                 $_group = \ingot\testing\crud\group::read($group_id);
                 $_group['variants'] = $variants;
                 $saved = \ingot\testing\crud\group::update($_group, $group_id, true);
             }
         }
     }
     return $groups;
 }
Example #10
0
 /**
  * Test that EDD sale of non-variable product is properly priced/recorded
  *
  * @since 1.1.0
  *
  * @group pricez
  * @group edd_price
  *
  * @covers \ingot\testing\tests\price\plugins\edd
  */
 public function testPriceTrackingNonVariableProduct()
 {
     $price_is = 10;
     $product = ingot_test_data_price::edd_create_simple_download($price_is);
     $group_id = \ingot\testing\crud\group::create(['type' => 'price', 'sub_type' => 'edd', 'meta' => ['product_ID' => $product->ID], 'wp_ID' => $product->ID], true);
     $variant_one = \ingot\testing\crud\variant::create(['group_ID' => $group_id, 'type' => 'price', 'meta' => ['price' => [0.5]], 'content' => $product->ID], true);
     $variant_two = \ingot\testing\crud\variant::create(['group_ID' => $group_id, 'type' => 'price', 'meta' => ['price' => [0.5]], 'content' => $product->ID], true);
     $group = \ingot\testing\crud\group::read($group_id);
     $group['variants'] = [$variant_one, $variant_two];
     \ingot\testing\crud\group::update($group, $group_id, true);
     $cookie_class = new \ingot\testing\cookies\price([]);
     $price_cookie = $cookie_class->get_cookie();
     $this->assertArrayHasKey('edd', $price_cookie);
     $this->assertFalse(empty($price_cookie['edd']));
     $this->assertInternalType('array', $price_cookie['edd']);
     $product_id = \ingot\testing\utility\price::get_product_ID($group);
     $this->assertEquals($product_id, $product->ID);
     $this->assertArrayHasKey($product_id, $price_cookie['edd']);
     new \ingot\testing\tests\price\plugins\edd($price_cookie['edd']);
     $test = \ingot\testing\utility\price::get_price_test_from_cookie('edd', $product->ID, $price_cookie);
     $this->assertInternalType('object', $test);
     $price_should_be = $test->get_price();
     //NOTE: USING edd_get_download_price here is to ensure we don't have recursion
     $this->assertEquals(edd_get_download_price($product->ID), $price_should_be);
     $group_obj = new \ingot\testing\object\group($group_id);
     $lever = $group_obj->get_lever($test->ID);
     $this->assertInternalType('object', $lever);
     $before_wins = $lever->getNumerator();
     $payment_id = ingot_test_data_price::edd_create_simple_payment($product);
     edd_complete_purchase($payment_id, 'publish', 'pending');
     $group_obj = new \ingot\testing\object\group($group_id);
     $lever = $group_obj->get_lever($test->ID);
     $this->assertInternalType('object', $lever);
     $after_wins = $lever->getNumerator();
     $this->assertEquals($before_wins + 1, $after_wins);
 }
Example #11
0
 protected function create_experiment()
 {
     $group = group::read($this->ID);
     if (!empty($group['variants'])) {
         $variants = helpers::make_array_values_numeric($group['variants'], true);
         $creator = new CreateExperiment($variants, $this->ID, $this->bandit);
         $this->experiment = $creator->get_experiment();
     }
 }
 public function setUp()
 {
     parent::setUp();
     \ingot\testing\crud\group::delete('all');
     \ingot\testing\crud\variant::delete('all');
 }
Example #13
0
 /**
  * Check if all tables exists
  *
  * @since 1.1.0
  * @since 0.3.0 in class ingot_boostrap
  *
  * @access protected
  *
  * @return bool
  */
 public static function check_if_tables_exist()
 {
     if (!self::table_exists(\ingot\testing\crud\tracking::get_table_name()) || !self::table_exists(\ingot\testing\crud\group::get_table_name()) || !self::table_exists(\ingot\testing\crud\session::get_table_name()) || !self::table_exists(\ingot\testing\crud\variant::get_table_name())) {
         return false;
     }
     return true;
 }
Example #14
0
 /**
  * Clear out invalid destination cookies
  *
  * @since 1.1.0
  *
  * @param $groups
  */
 public static function clear_invalid(array $groups)
 {
     $cookies = cookie::get_all_cookies();
     $clear = [];
     if (empty($groups)) {
         $clear = $groups;
     } elseif (!empty($cookies) && !empty($groups)) {
         foreach ($cookies as $group_id) {
             if (!in_array($group_id, $groups) || !group::exists($group_id)) {
                 cookie::clear_cookie($group_id);
             }
         }
     }
     if (!empty($clear)) {
         foreach ($clear as $group_id) {
             cookie::clear_cookie($group_id);
         }
     }
 }
Example #15
0
 /**
  * Test that when we can update other stuff through group object
  *
  * @since 0.4.0
  *
  * @group group
  * @group group_object
  *
  * @covers \ingot\testing\object\group::get_group_config()
  * @covers \ingot\testing\object\group::update_group()
  */
 public function testUpdateThroughObject()
 {
     $groups = ingot_tests_make_groups(true, 1, 3);
     $id = $groups['ids'][0];
     $this->assertTrue(is_numeric($id));
     $variants = $groups['variants'][$id];
     $obj = new \ingot\testing\object\group($id);
     $this->assertEquals($variants, $obj->get_group_config()['variants']);
     $new_data = ['name' => 'BATMAN'];
     $obj->update_group($new_data);
     $group = \ingot\testing\crud\group::read($id);
     $this->assertEquals('BATMAN', $group['name']);
     $new_data = ['name' => 'Hi Roy', 'sub_type' => 'button_color'];
     $obj->update_group($new_data);
     $group = \ingot\testing\crud\group::read($id);
     $this->assertEquals('Hi Roy', $group['name']);
     $this->assertEquals('button_color', $group['sub_type']);
 }
 /**
  * Test that we can query by plugin and exclude those without variants
  *
  * @since 1.1.0
  *
  * @group xs
  * @group price_query
  * @group price
  *
  * @covers \ingot\testing\crud\price_query::find_by_plugin()
  */
 public function testQueryByPluginNoVariant()
 {
     $args = ['type' => 'price', 'sub_type' => 'edd', 'meta' => ['product_ID' => 5], 'wp_ID' => 5];
     $variant_args = ['type' => 'price', 'meta' => ['price' => []], 'content' => 5];
     for ($i = 0; $i <= 5; $i++) {
         $group_id = \ingot\testing\crud\group::create($args);
         $args['wp_ID'] = $args['wp_ID'] + 1;
         if (3 == $i) {
             $expected_id = $group_id;
             $variant_args['group_ID'] = $group_id;
             $variant_args['meta']['price'] = rand_float();
             $variant_id = \ingot\testing\crud\variant::create($variant_args, true);
             $this->assertTrue(is_numeric($variant_id));
             $group = \ingot\testing\crud\group::read($group_id);
             $group['variants'] = [$variant_id];
             \ingot\testing\crud\group::update($group, $group_id, true);
         }
     }
     $groups = \ingot\testing\crud\price_query::find_by_plugin('edd', true);
     $this->assertInternalType('array', $groups);
     $this->assertFalse(empty($groups));
     $ids = wp_list_pluck($groups, 'ID');
     $this->assertTrue(in_array($expected_id, $ids));
     $this->assertSame(1, count($groups));
 }
Example #17
0
 /**
  * Set group property
  *
  * @since 0.0.5
  *
  * @access private
  *
  * @param int|array $group
  */
 private function set_group($group)
 {
     // @todo maybe use group object here since it will validate
     if (is_array($group)) {
         $this->group = $group;
     } else {
         $this->group = group::read($group);
     }
 }
Example #18
0
 /**
  * Get all fields of a group object
  *
  * @since 0.4.0
  *
  * @access protected
  *
  * @return array
  */
 protected function all_fields()
 {
     $fields = \ingot\testing\crud\group::get_all_fields();
     $fields[] = 'ID';
     return $fields;
 }
Example #19
0
 /**
  * Add wp_ID column to the groups table
  *
  * @since 1.1.0
  */
 public function add_wp_id_column()
 {
     global $wpdb;
     $table_name = group::get_table_name();
     $wpdb->query(sprintf("ALTER TABLE %s ADD COLUMN wp_ID VARCHAR(255) NOT NULL", $table_name));
 }
 /**
  *
  *
  * @since 1.1.0
  *
  * @group group
  * @group destination
  * @group cookie
  * @group destination_cookie
  *
  * @covers \ingot\testing\tests\click\destination\init::get_test()
  * @covers \ingot\testing\tests\click\destination\init::set_tracking()
  * @covers \ingot\testing\tests\click\destination\cookie::get_cookie()
  */
 public function testCookieTracking()
 {
     $data = ingot_test_desitnation::create('page');
     $group_id = $data['group_ID'];
     $this->assertTrue(is_numeric($group_id));
     $group = \ingot\testing\crud\group::read($group_id);
     $this->assertInternalType('array', $group);
     $bandit = new \ingot\testing\bandit\content($group_id);
     $variant_id = $bandit->choose();
     $this->assertTrue(is_numeric($variant_id));
     \ingot\testing\tests\click\destination\init::set_tracking();
     \ingot\testing\tests\click\destination\init::get_test($group_id);
     $obj = new \ingot\testing\object\group($group_id);
     $levers = $obj->get_levers();
     $this->assertInternalType('array', $levers);
     $cookie_name = \ingot\testing\tests\click\destination\cookie::cookie_key($group_id);
     $variant_id = \ingot\testing\tests\click\destination\init::get_test($group_id);
     $this->assertTrue(is_numeric($variant_id));
     $_COOKIE[$cookie_name] = $variant_id;
     $this->assertEquals($variant_id, \ingot\testing\tests\click\destination\cookie::get_cookie($group_id));
     $obj = new \ingot\testing\object\group($group_id);
     $_levers = $obj->get_levers();
     for ($i = 0; $i <= 10; $i++) {
         \ingot\testing\tests\click\destination\init::set_tracking();
     }
     $obj = new \ingot\testing\object\group($group_id);
     $levers = $obj->get_levers();
     $this->assertEquals($levers, $_levers);
     $this->assertInternalType('array', $levers);
     $this->assertArrayHasKey($group_id, $levers);
     $this->assertArrayHasKey($variant_id, $levers[$group_id]);
     $lever = $levers[$variant_id];
     $this->assertInternalType('object', $lever);
     $this->assertEquals(0, $lever->getNumerator());
     $this->assertEquals(1, $lever->getDenominator());
 }
Example #21
0
 /**
  * Add test to cookie
  *
  * @since 1.1.0
  *
  * @access protected
  *
  * @param array $group Group config
  */
 protected function add_test($group)
 {
     if (group::valid($group)) {
         $test = $this->setup_test_object($group);
         if (is_object($test)) {
             $product_ID = \ingot\testing\utility\price::get_product_ID($group);
             if (is_object($test) && is_numeric($product_ID)) {
                 $this->cookie[$group['sub_type']][$product_ID] = wp_json_encode($test);
             }
         }
     }
 }
Example #22
0
 /**
  * Test that we can't create a group for a product that is already being tested
  *
  * @since 1.1.0
  *
  * @group price
  * @group helper
  * @covers 	\ingot\testing\utility\price::product_test_exists()
  */
 public function testPriceTestExists()
 {
     $group = \ingot\testing\crud\group::create(['name' => 'd', 'type' => 'price', 'sub_type' => 'edd', 'meta' => ['product_ID' => 169], 'wp_ID' => 169], true);
     $this->assertTrue(is_numeric($group));
     $existing = \ingot\testing\utility\price::product_test_exists(169);
     $this->assertEquals($existing, $group);
 }
 /**
  * Create the variants and save in group
  *
  * @param int $group_id The group ID
  *
  * @return int|WP_Error Should return group ID. May return WP_Error if there was an error creating variants or saving them in group.
  */
 protected function add_variants($group_id)
 {
     $variant_args = ['type' => 'click', 'group_ID' => $group_id];
     /**
      * This array will be the HTML we output for each variant.
      *
      * As an example I'm using URLs of cute cate photos
      *
      * @TODO -- You should use something meaningful here.
      */
     $variant_contents = ['https://placekitten.com/900/300', 'https://placekitten.com/900/200', 'https://placekitten.com/800/400'];
     $variant_ids = [];
     //create the variants
     foreach ($variant_contents as $content) {
         $variant_args['content'] = $content;
         $variant_id = \ingot\testing\crud\variant::create($variant_args);
         if (is_numeric($variant_id)) {
             $variant_ids[] = $variant_id;
         } else {
             return $variant_id;
         }
     }
     //save variant IDs in group
     $group = \ingot\testing\crud\group::read($group_id);
     $group['variants'] = $variant_ids;
     $saved = \ingot\testing\crud\group::update($group, $group_id);
     //this should be the group ID, could be an error.
     return $saved;
 }
 /**
  * Check getting page ID
  *
  * @since 1.1.0
  *
  * @group group
  * @group destination
  *
  * \ingot\testing\utility\destination::get_page_id()
  */
 public function testGetPageID()
 {
     $data = ingot_test_desitnation::create('page', true);
     $group = \ingot\testing\crud\group::read($data['group_ID']);
     $this->assertSame($data['page'], \ingot\testing\utility\destination::get_page_id($group));
 }
 /**
  * Track EDD sale conversions
  *
  * @since 1.1.0
  *
  * @group group
  * @group destination
  * @group edd
  *
  * @covers  \ingot\testing\tests\click\destination\hooks::edd_complete_purchase()
  * @covers  \ingot\testing\tests\click\destination\hooks::add_hooks()
  */
 public function testEDDConversionsSale()
 {
     if (ingot_is_edd_active()) {
         $this->assertTrue(\ingot\testing\tests\click\destination\types::allowed_destination_type('sale_edd'));
         $product = ingot_test_data_price::edd_create_simple_download(10);
         $data = ingot_test_desitnation::create('sale_edd');
         $group_id = $data['group_ID'];
         $this->assertTrue(is_numeric($group_id));
         $variants = $data['variants'];
         new \ingot\testing\bandit\content($group_id);
         $variant_id = \ingot\testing\tests\click\destination\init::get_test($group_id);
         $this->assertTrue(is_numeric($variant_id));
         \ingot\testing\tests\click\destination\init::set_tracking();
         $this->assertTrue(in_array(\ingot\testing\tests\click\destination\init::get_test($group_id), $variants));
         $variant_id = \ingot\testing\tests\click\destination\init::get_test($group_id);
         $hooks = new \ingot\testing\tests\click\destination\hooks([$group_id]);
         $payment_id = ingot_test_data_price::edd_create_simple_payment($product);
         edd_complete_purchase($payment_id, 'publish', 'pending');
         $group = \ingot\testing\crud\group::read($group_id);
         $totals = \ingot\testing\utility\group::get_total($group);
         $this->assertEquals(3, $totals['total']);
         $this->assertEquals(2, $totals['conversions']);
     }
 }
Example #26
0
 /**
  * Check if a price test group already exists for a given product
  *
  * @since 1.1.0
  *
  * @param int $product_id Product ID
  *
  * @return bool|int False if none exist, ID of existing group if found.
  */
 public static function product_test_exists($product_id)
 {
     global $wpdb;
     $table_name = \ingot\testing\crud\group::get_table_name();
     $sql = sprintf('SELECT `ID` FROM `%s` WHERE `wp_ID` = %d AND `type` = "price"', $table_name, $product_id);
     $result = $wpdb->query($sql, ARRAY_A);
     if (empty($result)) {
         return false;
     } else {
         if (is_numeric($result)) {
             return $result;
         }
         if (is_array($result) && isset($result[0])) {
             $result[0];
         }
         return true;
     }
 }
Example #27
0
 /**
  * Test multiple conversions
  *
  * @todo move this test to a better place
  *
  * @since 0.4.0
  *
  * @group bandit
  * @group group
  * @group front_ui
  *
  * @covers ingot_register_conversion()
  */
 public function testMultipleConversions()
 {
     $groups = ingot_tests_data::click_link_group(true, 1, 3);
     $group_id = $groups['ids'][0];
     $variants = $groups['variants'][$groups['ids'][0]];
     $expected = [];
     foreach ($variants as $variant) {
         $expected[$variant] = ['n' => 0, 'd' => 0];
     }
     for ($i = 0; $i <= 25; $i++) {
         $chosen = $this->check_render($groups);
         if (in_array($i, [2, 3, 5, 8, 13, 21])) {
             ingot_register_conversion($chosen);
             $expected[$chosen]['n'] = $expected[$chosen]['n'] + 1;
         }
         $expected[$chosen]['d'] = $expected[$chosen]['d'] + 1;
         $levers = \ingot\testing\crud\group::get_levers($group_id);
         /** @var \MaBandit\Lever $lever */
         foreach ($levers[$group_id] as $id => $lever) {
             if ($chosen != $id) {
                 $this->assertSame($expected[$id]['n'], $lever->getNumerator(), $id . '-' . $lever->getNumerator());
                 $this->assertSame($expected[$id]['d'], $lever->getDenominator(), $id);
             }
         }
     }
 }
Example #28
0
 /**
  * Test that when we can add levers directly
  *
  * @since 0.4.0
  *
  * @group crud
  * @group group
  * @group group_crud
  *
  * @covers \ingot\testing\crud\group::update()
  */
 public function testLevers()
 {
     $groups = ingot_tests_make_groups(true, 1, 3);
     $group_id = $groups['ids'][0];
     $bandit = new \ingot\testing\bandit\content($group_id);
     $group = \ingot\testing\crud\group::read($group_id);
     $this->assertFalse(empty($group['levers']));
     $this->assertArrayHasKey((int) $group_id, $group['levers']);
     $this->assertSame(4, count($group['levers'][$group_id]));
 }
Example #29
0
 /**
  * Get all fields that a group in a response should have
  *
  * @since 0.4.0
  *
  * @return array
  */
 private function get_fields_to_check_for()
 {
     $fields = \ingot\testing\crud\group::get_all_fields();
     $fields[] = 'ID';
     $flipped = array_flip($fields);
     $l = $flipped['levers'];
     unset($fields[$l]);
     return $fields;
 }
Example #30
0
/**
 * Create a REST response
 *
 * @param array|object|\WP_Error $data Response data
 * @param int $code Optional. Status cod. Default is 200
 * @param int|null $total Optional. if is an integer, will be used to set X-Ingot-Total header
 *
 * @return \WP_REST_Response|\WP_Error
 */
function ingot_rest_response($data, $code = 200, $total = null)
{
    if (!is_wp_error($data)) {
        if (404 == $code || empty($data)) {
            $response = new \WP_REST_Response(null, 404);
        } else {
            $response = new \WP_REST_Response($data, $code);
        }
        if (0 < absint($total)) {
            $response->header('X-Ingot-Total', (int) \ingot\testing\crud\group::total());
        }
        return $response;
    } else {
        return $data;
    }
}