From e9b1031f16f9842093e27c5dde1fb5eff9b4d436 Mon Sep 17 00:00:00 2001
From: Anton Soldatov <igelhaus@gmail.com>
Date: Thu, 10 Apr 2014 11:02:33 +0400
Subject: [PATCH] Adding tests for 0.0.3

---
 t/00-use.t         |   8 +++
 t/01-dispatching.t | 159 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 167 insertions(+)
 create mode 100644 t/00-use.t
 create mode 100644 t/01-dispatching.t

diff --git a/t/00-use.t b/t/00-use.t
new file mode 100644
index 0000000..30126e4
--- /dev/null
+++ b/t/00-use.t
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+
+use Test::More tests => 1;
+
+BEGIN { use_ok('RedMiner::API') };
+
+exit;
diff --git a/t/01-dispatching.t b/t/01-dispatching.t
new file mode 100644
index 0000000..1da677c
--- /dev/null
+++ b/t/01-dispatching.t
@@ -0,0 +1,159 @@
+use strict;
+use warnings;
+
+use Test::More;
+
+BEGIN { use_ok('RedMiner::API') };
+
+#
+# Tests for internal dispatching mechanizm
+#
+
+my $redminer = RedMiner::API->new(
+	host => '',
+	key  => ''
+);
+
+my $r;
+
+$r = $redminer->_dispatch_name;
+ok(!defined $r, 'Must fail: undefined name');
+
+$r = $redminer->_dispatch_name('read');
+ok(!defined $r, 'Must fail: malformed name, no objects given');
+
+$r = $redminer->_dispatch_name('readproject2');
+ok(!defined $r, 'Must fail: malformed name, inappropriate object naming');
+
+$r = $redminer->_dispatch_name('project', { id => 1 });
+ok(!defined $r, 'Must fail: malformed object ID');
+
+$r = $redminer->_dispatch_name('createProject');
+ok(!defined $r, 'Must fail: malformed name, missing data argument for a create/update method');
+
+$r = $redminer->_dispatch_name('updateProject', 1);
+ok(!defined $r, 'Must fail: malformed name, missing data argument for a create/update method');
+
+$r = $redminer->_dispatch_name('createProject', 1, 'scalar');
+ok(!defined $r, 'Must fail: malformed name, inappropriate data type for a create/update method');
+
+$r = $redminer->_dispatch_name('updateProject', 1, 'scalar');
+ok(!defined $r, 'Must fail: malformed name, inappropriate data type for a create/update method');
+
+#
+# Testing basic CRUD API:
+# * List existing objects (possibly with extra metadata)s
+# * Read an object (possibly with extra metadata)
+# * Create a new object
+# * Update an existing object
+# * Delete an existing object
+#
+
+$r = $redminer->_dispatch_name('projects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+# ditto
+$r = $redminer->_dispatch_name('Projects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+# ditto
+$r = $redminer->_dispatch_name('getProjects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+# ditto
+$r = $redminer->_dispatch_name('getprojects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+# ditto
+$r = $redminer->_dispatch_name('readProjects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+# ditto
+$r = $redminer->_dispatch_name('readprojects', { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projects');
+
+$r = $redminer->_dispatch_name('project', 1);
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects/1',
+	content => undef,
+	query   => undef,
+}, 'project');
+
+$r = $redminer->_dispatch_name('createProject', { name => 'My Project' });
+is_deeply($r, {
+	method => 'POST',
+	path   => 'projects',
+	content => { project => { name => 'My Project' } },
+	query   => undef,
+}, 'createProject');
+
+$r = $redminer->_dispatch_name('updateProject', 1, { name => 'My Project' });
+is_deeply($r, {
+	method => 'PUT',
+	path   => 'projects/1',
+	content => { project => { name => 'My Project' } },
+	query   => undef,
+}, 'updateProject');
+
+$r = $redminer->_dispatch_name('deleteProject', 1);
+is_deeply($r, {
+	method => 'DELETE',
+	path   => 'projects/1',
+	content => undef,
+	query   => undef,
+}, 'deleteProject');
+
+#
+# Dispatching methods with more than 1 identifying object:
+#
+
+$r = $redminer->_dispatch_name('projectMemberships', 1, { limit => 10, offset => 9 });
+is_deeply($r, {
+	method => 'GET',
+	path   => 'projects/1/memberships',
+	content => undef,
+	query   => { limit => 10, offset => 9 },
+}, 'projectMemberships');
+
+$r = $redminer->_dispatch_name('createProjectMembership', 1, { user_id => 1, role_ids => [ 1 ] });
+is_deeply($r, {
+	method => 'POST',
+	path   => 'projects/1/memberships',
+	content => { membership => { user_id => 1, role_ids => [ 1 ] } },
+	query   => undef,
+}, 'createProjectMembership');
+
+done_testing;
+
+exit;
-- 
GitLab