working on builder

This commit is contained in:
John Bintz 2010-01-17 19:41:10 -05:00
parent c37be6be2b
commit 81f6496efe
3 changed files with 207 additions and 27 deletions

View File

@ -62,15 +62,71 @@ class FixtureBuilder {
function defer() { function defer() {
if (!empty($this->current_object)) { if (!empty($this->current_object)) {
$this->ensure_type($this->current_object['type']); $this->ensure_type($this->current_object['type']);
$this->{"build_{$this->current_object['type']}"}($this->current_object); $this->{"defer_{$this->current_object['type']}"}($this->current_object);
} }
} }
function build() {
if (!empty($this->current_object)) {
$this->ensure_type($this->current_object['type']);
return $this->{"build_{$this->current_object['type']}"}($this->current_object);
}
}
function categories($categories) {
$this->check_correct_type('post');
$this->current_object['post']['categories'] = explode(',', $categories);
return $this;
}
function metadata($key, $value) {
$this->check_correct_type('post');
if (!isset($this->current_object['post'])) {
$this->current_object['post'] = array();
}
$this->current_object['post']['metadata'][$key] = $value;
return $this;
}
function defer_category($obj) {
$this->deferred_builds['category'] = array_merge($this->deferred_builds['category'], explode(',', $obj['name']));
}
function defer_post($obj) {
$this->deferred_builds['post'][] = $obj['post'];
}
function build_category($obj) { function build_category($obj) {
$this->deferred_builds['category'] = array_merge($this->deferred_builds['category'], explode('/', $obj['name'])); return PostFixtures::create_category($obj['name']);
} }
function build_post($obj) { function build_post($obj) {
$this->deferred_builds['post'][] = $obj['post']; $post_obj = $obj['post'];
foreach (array('categories', 'metadata') as $field) {
unset($post_obj[$field]);
}
$post_id = PostFixtures::create_post($post_obj);
if ($post_id != 0) {
$category_ids = array();
if (isset($obj['post']['categories'])) {
$category_ids_by_slug = array();
foreach ($obj['post']['categories'] as $category) {
$category_ids_by_slug = array_merge($category_ids_by_slug, PostFixtures::create_category($category));
}
$category_ids = array_values($category_ids_by_slug);
}
$metadata = array();
if (isset($obj['post']['metadata'])) {
foreach ($obj['post']['metadata'] as $key => $value) {
PostFixtures::create_post_metadata($post_id, $key, $value);
}
}
return get_post($post_id);
}
return false;
} }
} }

View File

@ -176,14 +176,20 @@ class PostFixtures {
$category_ids_by_slug = array(); $category_ids_by_slug = array();
if (is_array($categories)) { if (is_array($categories)) {
foreach ($categories as $category) { foreach ($categories as $category) {
$category_ids_by_slug = array_merge($category_ids_by_slug, $this->create_category($category));
}
}
return $category_ids_by_slug;
}
function create_category($category) {
$category_ids_by_slug = array();
$nodes = explode('/', $category); $nodes = explode('/', $category);
$parent = 0; $parent = 0;
$joined_nodes = array(); $joined_nodes = array();
foreach ($nodes as $node) { foreach ($nodes as $node) {
$joined_nodes[] = $node; $joined_nodes[] = $node;
$parent = $category_ids_by_slug[implode('/', $joined_nodes)] = wp_insert_category(array('cat_name' => $node, 'slug' => $node, 'category_parent' => $parent)); $parent = $category_ids_by_slug[implode('/', $joined_nodes)] = wp_insert_category(array('cat_name' => $node, 'category_nicename' => $node, 'category_parent' => $parent));
}
}
} }
return $category_ids_by_slug; return $category_ids_by_slug;
} }
@ -197,11 +203,7 @@ class PostFixtures {
$post_ids_created = array(); $post_ids_created = array();
if (is_array($posts)) { if (is_array($posts)) {
foreach ($posts as $post) { foreach ($posts as $post) {
$post = (array)$post; $id = $this->create_post($post);
if (!isset($post['post_status'])) {
$post['post_status'] = 'publish';
}
$id = wp_insert_post($post);
if ($id != 0) { if ($id != 0) {
$post_ids_created[] = $id; $post_ids_created[] = $id;
if (isset($post['categories'])) { if (isset($post['categories'])) {
@ -218,7 +220,7 @@ class PostFixtures {
if (isset($post['metadata'])) { if (isset($post['metadata'])) {
foreach ($post['metadata'] as $key => $value) { foreach ($post['metadata'] as $key => $value) {
update_post_meta($id, $key, $value); $this->create_post_metadata($id, $key, $value);
} }
} }
} }
@ -227,6 +229,18 @@ class PostFixtures {
return $post_ids_created; return $post_ids_created;
} }
function create_post($post) {
$post = (array)$post;
if (!isset($post['post_status'])) {
$post['post_status'] = 'publish';
}
return wp_insert_post($post);
}
function create_post_metadata($post_id, $key, $value) {
update_post_meta($post_id, $key, $value);
}
/** /**
* Create everything from the provided data. * Create everything from the provided data.
* @param array $data The data to use in creation. * @param array $data The data to use in creation.

View File

@ -20,7 +20,7 @@ class FixtureBuilderTest extends PHPUnit_Framework_TestCase {
), ),
array( array(
array( array(
array('category', array('test/test2')) array('category', array('test,test2'))
), ),
array('category' => array('test', 'test2')), array('category' => array('test', 'test2')),
array(true) array(true)
@ -44,16 +44,22 @@ class FixtureBuilderTest extends PHPUnit_Framework_TestCase {
array( array(
array( array(
array('post', array('Post title')), array('post', array('Post title')),
array('date', array('2010-01-01')) array('date', array('2010-01-01')),
array('categories', array('test,test2')),
array('metadata', array('key', array('metadata' => 'value'))),
), ),
array('post' => array( array(
'post' => array(
array( array(
'post_title' => 'Post title', 'post_title' => 'Post title',
'post_date' => '2010-01-01',
'post_type' => 'post', 'post_type' => 'post',
'post_date' => '2010-01-01',
'categories' => array('test', 'test2'),
'metadata' => array('key' => array('metadata' => 'value'))
) )
)), ),
array(true, true) ),
array(true, true, true, true)
), ),
); );
} }
@ -72,7 +78,7 @@ class FixtureBuilderTest extends PHPUnit_Framework_TestCase {
$return = call_user_func_array(array($builder, $instruction), $parameters); $return = call_user_func_array(array($builder, $instruction), $parameters);
$this->assertTrue($expected_exception); $this->assertTrue($expected_exception);
} catch (Exception $e) { } catch (Exception $e) {
$this->assertFalse($expected_exception); $this->assertFalse($expected_exception, $e->getMessage());
$this->assertType('LogicException', $e); $this->assertType('LogicException', $e);
} }
} }
@ -81,4 +87,108 @@ class FixtureBuilderTest extends PHPUnit_Framework_TestCase {
$this->assertEquals($expected_deferred_build, $builder->deferred_builds); $this->assertEquals($expected_deferred_build, $builder->deferred_builds);
} }
function providerTestImmediateBuild() {
return array(
array(
array(
array(
'category',
array('test'),
),
array(
'category',
array('test/test2'),
)
),
array('test' => 1, 'test/test2' => 2),
array(
'categories' => array(
1 => 'test',
2 => 'test2'
)
)
),
array(
array(
array(
'post',
array('Post title')
),
array(
'date',
array('2010-01-01')
),
array(
'categories',
array('test')
),
array(
'metadata',
array('test', 'test2')
)
),
(object)array(
'post_title' => 'Post title',
'post_type' => 'post',
'post_date' => '2010-01-01',
'post_status' => 'publish',
'ID' => 1
),
array(
'posts' => array(
1 => (object)array(
'post_title' => 'Post title',
'post_type' => 'post',
'post_date' => '2010-01-01',
'post_status' => 'publish',
'ID' => 1
)
),
'categories' => array(
1 => 'test'
),
'post_meta' => array(
1 => array(
'test' => 'test2'
)
)
)
)
);
}
/**
* @dataProvider providerTestImmediateBuild
*/
function testImmediateBuild($instructions, $expected_return, $wp_checks) {
$builder = new FixtureBuilder();
foreach ($instructions as $info) {
list($instruction, $parameters) = $info;
call_user_func_array(array($builder, $instruction), $parameters);
}
$this->assertEquals($expected_return, $builder->build());
foreach ($wp_checks as $type => $info) {
switch ($type) {
case 'posts':
foreach ($info as $key => $post) {
$this->assertEquals($post, get_post($key));
}
break;
case 'categories':
foreach ($info as $key => $category_name) {
$this->assertEquals($category_name, get_cat_name($key));
}
break;
case 'post_meta':
foreach ($info as $post_id => $meta_info) {
foreach ($meta_info as $key => $value) {
$this->assertEquals($value, get_post_meta($post_id, $key, true));
}
}
break;
}
}
}
} }