| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | 
							- <?php
 
- /**
 
-  * test \ElggBatch
 
-  *
 
-  */
 
- class ElggBatchTest extends \ElggCoreUnitTest {
 
- 	// see https://github.com/elgg/elgg/issues/4288
 
- 	public function testElggBatchIncOffset() {
 
- 		// normal increment
 
- 		$options = array(
 
- 			'offset' => 0,
 
- 			'limit' => 11
 
- 		);
 
- 		$batch = new \ElggBatch(array('\ElggBatchTest', 'elgg_batch_callback_test'), $options,
 
- 				null, 5);
 
- 		$j = 0;
 
- 		foreach ($batch as $e) {
 
- 			$offset = floor($j / 5) * 5;
 
- 			$this->assertEqual($offset, $e['offset']);
 
- 			$this->assertEqual($j + 1, $e['index']);
 
- 			$j++;
 
- 		}
 
- 		$this->assertEqual(11, $j);
 
- 		// no increment, 0 start
 
- 		\ElggBatchTest::elgg_batch_callback_test(array(), true);
 
- 		$options = array(
 
- 			'offset' => 0,
 
- 			'limit' => 11
 
- 		);
 
- 		$batch = new \ElggBatch(array('\ElggBatchTest', 'elgg_batch_callback_test'), $options,
 
- 				null, 5);
 
- 		$batch->setIncrementOffset(false);
 
- 		$j = 0;
 
- 		foreach ($batch as $e) {
 
- 			$this->assertEqual(0, $e['offset']);
 
- 			// should always be the same 5
 
- 			$this->assertEqual($e['index'], $j + 1 - (floor($j / 5) * 5));
 
- 			$j++;
 
- 		}
 
- 		$this->assertEqual(11, $j);
 
- 		// no increment, 3 start
 
- 		\ElggBatchTest::elgg_batch_callback_test(array(), true);
 
- 		$options = array(
 
- 			'offset' => 3,
 
- 			'limit' => 11
 
- 		);
 
- 		$batch = new \ElggBatch(array('\ElggBatchTest', 'elgg_batch_callback_test'), $options,
 
- 				null, 5);
 
- 		$batch->setIncrementOffset(false);
 
- 		$j = 0;
 
- 		foreach ($batch as $e) {
 
- 			$this->assertEqual(3, $e['offset']);
 
- 			// same 5 results
 
- 			$this->assertEqual($e['index'], $j + 4 - (floor($j / 5) * 5));
 
- 			$j++;
 
- 		}
 
- 		$this->assertEqual(11, $j);
 
- 	}
 
- 	public function testElggBatchReadHandlesBrokenEntities() {
 
- 		$num_test_entities = 8;
 
- 		$guids = array();
 
- 		for ($i = $num_test_entities; $i > 0; $i--) {
 
- 			$entity = new \ElggObject();
 
- 			$entity->type = 'object';
 
- 			$entity->subtype = 'test_5357_subtype';
 
- 			$entity->access_id = ACCESS_PUBLIC;
 
- 			$entity->save();
 
- 			$guids[] = $entity->guid;
 
- 			_elgg_invalidate_cache_for_entity($entity->guid);
 
- 		}
 
- 		// break entities such that the first fetch has one incomplete
 
- 		// and the second and third fetches have only incompletes!
 
- 		$db_prefix = elgg_get_config('dbprefix');
 
- 		delete_data("
 
- 			DELETE FROM {$db_prefix}objects_entity
 
- 			WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
 
- 		");
 
- 		$options = array(
 
- 			'type' => 'object',
 
- 			'subtype' => 'test_5357_subtype',
 
- 			'order_by' => 'e.guid',
 
- 		);
 
- 		$entities_visited = array();
 
- 		$batch = new \ElggBatch('elgg_get_entities', $options, null, 2);
 
- 		/* @var \ElggEntity[] $batch */
 
- 		foreach ($batch as $entity) {
 
- 			$entities_visited[] = $entity->guid;
 
- 		}
 
- 		// The broken entities should not have been visited
 
- 		$this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
 
- 		// cleanup (including leftovers from previous tests)
 
- 		$entity_rows = elgg_get_entities(array_merge($options, array(
 
- 			'callback' => '',
 
- 			'limit' => false,
 
- 		)));
 
- 		$guids = array();
 
- 		foreach ($entity_rows as $row) {
 
- 			$guids[] = $row->guid;
 
- 		}
 
- 		delete_data("DELETE FROM {$db_prefix}entities WHERE guid IN (" . implode(',', $guids) . ")");
 
- 		delete_data("DELETE FROM {$db_prefix}objects_entity WHERE guid IN (" . implode(',', $guids) . ")");
 
- 		remove_subtype('object', 'test_5357_subtype');
 
- 	}
 
- 	public function testElggBatchDeleteHandlesBrokenEntities() {
 
- 		$num_test_entities = 8;
 
- 		$guids = array();
 
- 		for ($i = $num_test_entities; $i > 0; $i--) {
 
- 			$entity = new \ElggObject();
 
- 			$entity->type = 'object';
 
- 			$entity->subtype = 'test_5357_subtype';
 
- 			$entity->access_id = ACCESS_PUBLIC;
 
- 			$entity->save();
 
- 			$guids[] = $entity->guid;
 
- 			_elgg_invalidate_cache_for_entity($entity->guid);
 
- 		}
 
- 		// break entities such that the first fetch has one incomplete
 
- 		// and the second and third fetches have only incompletes!
 
- 		$db_prefix = elgg_get_config('dbprefix');
 
- 		delete_data("
 
- 			DELETE FROM {$db_prefix}objects_entity
 
- 			WHERE guid IN ({$guids[1]}, {$guids[2]}, {$guids[3]}, {$guids[4]}, {$guids[5]})
 
- 		");
 
- 		$options = array(
 
- 			'type' => 'object',
 
- 			'subtype' => 'test_5357_subtype',
 
- 			'order_by' => 'e.guid',
 
- 		);
 
- 		$entities_visited = array();
 
- 		$batch = new \ElggBatch('elgg_get_entities', $options, null, 2, false);
 
- 		/* @var \ElggEntity[] $batch */
 
- 		foreach ($batch as $entity) {
 
- 			$entities_visited[] = $entity->guid;
 
- 			$entity->delete();
 
- 		}
 
- 		// The broken entities should not have been visited
 
- 		$this->assertEqual($entities_visited, array($guids[0], $guids[6], $guids[7]));
 
- 		// cleanup (including leftovers from previous tests)
 
- 		$entity_rows = elgg_get_entities(array_merge($options, array(
 
- 			'callback' => '',
 
- 			'limit' => false,
 
- 		)));
 
- 		$guids = array();
 
- 		foreach ($entity_rows as $row) {
 
- 			$guids[] = $row->guid;
 
- 		}
 
- 		delete_data("DELETE FROM {$db_prefix}entities WHERE guid IN (" . implode(',', $guids) . ")");
 
- 		delete_data("DELETE FROM {$db_prefix}objects_entity WHERE guid IN (" . implode(',', $guids) . ")");
 
- 	}
 
- 	public static function elgg_batch_callback_test($options, $reset = false) {
 
- 		static $count = 1;
 
- 		if ($reset) {
 
- 			$count = 1;
 
- 			return true;
 
- 		}
 
- 		if ($count > 20) {
 
- 			return false;
 
- 		}
 
- 		for ($j = 0; ($options['limit'] < 5) ? $j < $options['limit'] : $j < 5; $j++) {
 
- 			$return[] = array(
 
- 				'offset' => $options['offset'],
 
- 				'limit' => $options['limit'],
 
- 				'count' => $count++,
 
- 				'index' => 1 + $options['offset'] + $j
 
- 			);
 
- 		}
 
- 		return $return;
 
- 	}
 
- }
 
 
  |