From b5e771339cab7fe130bd1c7d7457827ddd4dd4c6 Mon Sep 17 00:00:00 2001 From: "alextselegidis@gmail.com" Date: Mon, 26 Aug 2013 11:53:11 +0000 Subject: [PATCH] * Completed admins_model.php and secretaries_model.php * Completed unit testing for admins_model.php and secretaries_model.php --- .../libraries/Unit_tests/Unit_tests.php | 16 +- .../drivers/Unit_tests_admins_model.php | 416 +++++++++++++++++ .../drivers/Unit_tests_providers_model.php | 112 +++-- .../drivers/Unit_tests_secretaries_model.php | 441 ++++++++++++++++++ src/application/models/admins_model.php | 18 +- src/application/models/providers_model.php | 14 +- src/application/models/secretaries_model.php | 277 ++++++++++- 7 files changed, 1246 insertions(+), 48 deletions(-) create mode 100644 src/application/libraries/Unit_tests/drivers/Unit_tests_admins_model.php create mode 100644 src/application/libraries/Unit_tests/drivers/Unit_tests_secretaries_model.php diff --git a/src/application/libraries/Unit_tests/Unit_tests.php b/src/application/libraries/Unit_tests/Unit_tests.php index 1d1088d5..53b036cd 100644 --- a/src/application/libraries/Unit_tests/Unit_tests.php +++ b/src/application/libraries/Unit_tests/Unit_tests.php @@ -23,7 +23,9 @@ class Unit_tests extends CI_Driver_Library { 'Unit_tests_customers_model', 'Unit_tests_providers_model', 'Unit_tests_services_model', - 'Unit_tests_settings_model' + 'Unit_tests_settings_model', + 'Unit_tests_admins_model', + 'Unit_tests_secretaries_model' ); } @@ -53,11 +55,13 @@ class Unit_tests extends CI_Driver_Library { */ public function run_model_tests($output_report = true) { // @task Reenable all model tests. - //$this->appointments_model->run_all(); - //$this->customers_model->run_all(); - //$this->settings_model->run_all(); - $this->providers_model->run_all(); - //$this->services_model->run_all(); +// $this->appointments_model->run_all(); +// $this->customers_model->run_all(); +// $this->settings_model->run_all(); +// $this->providers_model->run_all(); +// $this->services_model->run_all(); +// $this->admins_model->run_all(); + $this->secretaries_model->run_all(); if ($output_report) { $this->CI->output->append_output($this->CI->unit->report()); diff --git a/src/application/libraries/Unit_tests/drivers/Unit_tests_admins_model.php b/src/application/libraries/Unit_tests/drivers/Unit_tests_admins_model.php new file mode 100644 index 00000000..5a6ff65e --- /dev/null +++ b/src/application/libraries/Unit_tests/drivers/Unit_tests_admins_model.php @@ -0,0 +1,416 @@ +ci =& get_instance(); + $this->ci->load->library('Unit_test'); + $this->ci->load->model('admins_model'); + + $this->admin_role_id = $this->ci->db->get_where('ea_roles', + array('slug' => DB_SLUG_ADMIN))->row()->id; + + $this->default_admin = array( + 'first_name' => 'John', + 'last_name' => 'Doe', + 'email' => 'john@doe.com', + 'mobile_number' => '2340982039', + 'phone_number' => '9098091234', + 'address' => 'Some Street 80', + 'city' => 'Some City', + 'state' => 'Some State', + 'zip_code' => '12345', + 'notes' => 'This is a test admin user.', + 'id_roles' => $this->admin_role_id + ); + } + + /** + * Run all the available tests + */ + public function run_all() { + // All the methods whose names start with "test" are going to be + // executed. If you want a method to not be executed remove the + // "test" keyword from the beginning. + $class_methods = get_class_methods('Unit_tests_admins_model'); + foreach ($class_methods as $method_name) { + if (substr($method_name, 0, 5) === 'test_') { + call_user_func(array($this, $method_name)); + } + } + } + + ///////////////////////////////////////////////////////////////////////// + // UNIT TESTS + ///////////////////////////////////////////////////////////////////////// + // TEST ADD METHOD ------------------------------------------------------ + private function test_add_insert() { + $admin = $this->default_admin; + + $admin['id'] = $this->ci->admins_model->add($admin); + $this->ci->unit->run($admin['id'], 'is_int', 'Test if add() - insert operation - has ' + . 'has returned an integer value.'); + + $db_record = $this->ci->db->get_where('ea_users', array('id' => $admin['id']))->row_array(); + $this->ci->unit->run($admin, $db_record, 'Test if add() - insert operation - has ' + . 'successfully inserted a new admin record.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_add_update() { + // Insert an admin record first and then update it. + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $admin['first_name'] = 'First Name Changed'; + $admin['last_name'] = 'Last Name Changed'; + $admin['email'] = 'email@changed.com'; + $admin['mobile_number'] = 'Mobile Number Changed'; + $admin['phone_number'] = 'Phone Number Changed'; + $admin['address'] = 'Address Changed'; + $admin['city'] = 'City Changed'; + $admin['zip_code'] = 'Zip Code Changed'; + $admin['notes'] = 'Notes Changed'; + + $update_result = $this->ci->admins_model->add($admin); // updates record + $this->ci->unit->run($update_result, 'is_int', 'Test if add() - update operation - has ' + . 'returned a valid integer value.'); + + $db_record = $this->ci->db->get_where('ea_users', array('id' => $admin['id']))->row_array(); + $this->ci->unit->run($admin, $db_record, 'Test if add() - update operation - has ' + . 'successfully updated an existing admin record.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_add_with_invalid_data() { + $admin = $this->default_admin; + $admin['email'] = 'Invalid Email Value'; + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->add($admin); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if add() has thrown an exception with ' + . 'invalid data.'); + } + + + // TEST EXITS METHOD ---------------------------------------------------- + private function test_exists_with_record_that_exists() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $exists = $this->ci->admins_model->exists($admin); + $this->ci->unit->run($exists, TRUE, 'Test if exists() has returned TRUE on record ' + . 'that exists.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_exists_with_invalid_data() { + $admin = $this->default_admin; + unset($admin['email']); // Email is mandatory for the function + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->exists($admin); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if exists() has thrown an exception ' + . 'on invalid admin data.'); + } + + private function test_exists_with_record_that_does_not_exist() { + $admin = $this->default_admin; + $exists = $this->ci->admins_model->exists($admin); + $this->ci->unit->run($exists, FALSE, 'Test if exists() returned FALSE with record ' + . 'that does not exist.'); + } + + // TEST DELETE METHOD --------------------------------------------------- + private function test_delete() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $delete_result = $this->ci->admins_model->delete($admin['id']); + $this->ci->unit->run($delete_result, TRUE, 'Test if delete() has returned TRUE on ' + . 'successfull deletion.'); + + $num_rows = $this->ci->db->get_where('ea_users', array('id' => $admin['id']))->num_rows(); + $this->ci->unit->run($num_rows, 0, 'Test if delete() has successfully removed the ' + . 'admin record from the database.'); + + if ($num_rows > 0) { + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + } + + private function test_delete_with_record_that_does_not_exist() { + $random_id = 2340923234; + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->delete($random_id); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if delete() has thrown exception ' + . 'on record that does not exist.'); + } + + private function test_delete_with_invalid_id_argument() { + $invalid_id = 'Not Numeric Value'; + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->delete($invalid_id); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if delete() has thrown exception ' + . 'on invalid id argument.'); + } + + private function test_delete_when_only_one_admin_user_left() { + // E!A must always have at least one admin user in the system + // This unit test requires only one admin record present in the database. + $admin_id = $this->ci->db->get_where('ea_users', array('id_roles' => $this->admin_role_id)) + ->row()->id; + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->delete($admin_id); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if delete() has thrown exception ' + . 'when trying to delete the only one left admin record.'); + } + + // TEST FIND RECORD ID METHOD ------------------------------------------- + private function test_find_record_id() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $result = $this->ci->admins_model->find_record_id($admin); + $this->ci->unit->run($result, $admin['id'], 'Test if find_record_id() has successfully ' + . 'found the correct record id.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_find_record_id_with_no_email_provided() { + $admin = $this->default_admin; + unset($admin['email']); + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->find_record_id($admin); + } catch(Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if find_record_id() has thrown ' + . 'an exception when trying to find a record id without email provided.'); + } + + private function test_find_record_id_with_record_that_does_not_exist() { + $admin = $this->default_admin; + $has_thrown_ecx = FALSE; + try { + $this->ci->admins_model->find_record_id($admin); + } catch (Exception $exc) { + $has_thrown_ecx = TRUE; + } + $this->ci->unit->run($has_thrown_ecx, TRUE, 'Test if find_record_id() has thrown ' + . 'exception when trying to find record that does not exist.'); + } + + + // TEST GET BATCH METHOD ------------------------------------------------ + private function test_get_batch() { + $model_batch = $this->ci->admins_model->get_batch(); + $db_batch = $this->ci->db->get_where('ea_users', array('id_roles' => $this->admin_role_id)) + ->result_array(); + $this->ci->unit->run($model_batch, $db_batch, 'Test if get_batch() has successfully ' + . 'returned an array of admin users.'); + } + + private function test_get_batch_with_where_clause() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $model_batch = $this->ci->admins_model->get_batch(array('id' => $admin['id'])); + $db_batch = $this->ci->db->get_where('ea_users', array('id' => $admin['id']))->result_array(); + + $this->ci->unit->run($model_batch, $db_batch, 'Test if get_batch() with where clause ' + . 'has successfully returned the correct results.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_get_batch_with_invalid_where_clause() { + // CI raises by itself an exception so this test case can be ignored. + } + + // TEST GET ROW METHOD -------------------------------------------------- + private function test_get_row() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $model_admin = $this->ci->admins_model->get_row($admin['id']); + $this->ci->unit->run($model_admin, $admin, 'Test if get_row() has successfully ' + . 'returned the data of the selected row.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_get_row_invalid_argument() { + $invalid_id = 'This is not numeric.'; + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->get_row($invalid_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_row() has thrown exception with ' + . 'invalid argument.'); + } + + private function test_get_row_record_does_not_exist() { + $random_id = 2390482039; + $res = $this->ci->admins_model->get_row($random_id); + $this->ci->unit->run($res, array(), 'Test if get_row() with record that does not exist ' + . 'has returned an empy array.'); + } + + // TEST GET VALUE METHOD ------------------------------------------------ + private function test_get_value() { + $admin = $this->default_admin; + $this->ci->db->insert('ea_users', $admin); + $admin['id'] = intval($this->ci->db->insert_id()); + + $last_name = $this->ci->admins_model->get_value('last_name', $admin['id']); + $this->ci->unit->run($last_name, $admin['last_name'], 'Test if get_value() has successfully ' + . 'returned the correct value.'); + + $this->ci->db->delete('ea_users', array('id' => $admin['id'])); + } + + private function test_get_value_invalid_field_name() { + $field_name = 230982039; // invalid: not string + $admin_id = 23; // random pick + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->get_value($field_name, $admin_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown an exception ' + . 'with invalid field name argument.'); + } + + private function test_get_value_invalid_admin_id() { + $field_name = 'last_name'; // random pick + $admin_id = 'This is invalid'; // not numerical + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->get_value($field_name, $admin_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown an exception ' + . 'with invalid admin id argument.'); + } + + private function test_get_value_record_does_not_exist() { + $field_name = 'last_name'; // random pick + $admin_id = 239409283092; // this id does not exist + + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->get_value($field_name, $admin_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown an exception ' + . 'with record that does not exist.'); + } + + private function tes_get_value_field_name_does_not_exist() { + $field_name = 'this does not exist'; + $admin_id = 23; // random pick + + + $has_thrown_exc = FALSE; + try { + $this->ci->admins_model->get_value($field_name, $admin_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown an exception ' + . 'with field name that does not exist.'); + } + + // TEST VALIDATE METHOD ------------------------------------------------- + private function test_validate() { + $admin = $this->default_admin; + $validation_result = $this->ci->admins_model->validate($admin); + $this->ci->unit->run($validation_result, TRUE, 'Test if validate() has returned TRUE on ' + . 'valid admin data.'); + } + + private function test_validate_record_does_not_exist() { + $admin = $this->default_admin; + $admin['id'] = 234092830; // record does not exist + $validation_result = $this->ci->admins_model->validate($admin); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has returned FALSE on ' + . 'record that does not exist.'); + } + + private function test_validate_missing_required_fields() { + // required fields: last_name, email, phone_number + + $admin = $this->default_admin; + unset($admin['last_name']); + unset($admin['email']); + unset($admin['phone_number']); + $validation_result = $this->ci->admins_model->validate($admin); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has returned FALSE on ' + . 'missing required field values.'); + } + + private function test_validate_invalid_email() { + $admin = $this->default_admin; + $admin['email'] = 'This is invalid'; + $validation_result = $this->ci->admins_model->validate($admin); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has returned FALSE on ' + . 'invalid email address.'); + } +} + +/* End of file Unit_tests_admins_model.php */ +/* Location: ./application/libraries/Unit_tests/drivers/Unit_tests_admins_model.php */ \ No newline at end of file diff --git a/src/application/libraries/Unit_tests/drivers/Unit_tests_providers_model.php b/src/application/libraries/Unit_tests/drivers/Unit_tests_providers_model.php index dddd971d..35fcf17e 100644 --- a/src/application/libraries/Unit_tests/drivers/Unit_tests_providers_model.php +++ b/src/application/libraries/Unit_tests/drivers/Unit_tests_providers_model.php @@ -52,6 +52,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => '12345', 'notes' => 'This is a test provider', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'test_prov', 'password' => 'test_prov', @@ -69,10 +70,15 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->unit->run($provider['id'], 'is_int', 'Check if add (insert) result is integer.'); // Check if record was inserted successfully. - $db_provider = $this->ci->db->get_where('ea_users', array('id' => $provider['id']))->row_array(); - $db_provider['settings'] = $this->ci->db->get_where('ea_user_settings', - array('id_users' => $provider['id']))->row_array(); + $db_provider = $this->ci->db + ->get_where('ea_users', array('id' => $provider['id'])) + ->row_array(); + $db_provider['services'] = array(); + $db_provider['settings'] = $this->ci->db + ->get_where('ea_user_settings', array('id_users' => $provider['id'])) + ->row_array(); unset($db_provider['settings']['id_users']); // not needed + $this->ci->unit->run($provider, $db_provider, 'Check if add(insert) has successfully ' . 'inserted a provider record.'); @@ -129,6 +135,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => 'CHANGED', 'notes' => 'CHANGED', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'CHANGED', 'password' => 'CHANGED', @@ -145,10 +152,15 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->unit->run($update_result, 'is_int', 'Check if add (update) result is integer.'); // Check if record was updated successfully - $db_provider = $this->ci->db->get_where('ea_users', array('id' => $provider['id']))->row_array(); - $db_provider['settings'] = $this->ci->db->get_where('ea_user_settings', - array('id_users' => $provider['id']))->row_array(); + $db_provider = $this->ci->db + ->get_where('ea_users', array('id' => $provider['id'])) + ->row_array(); + $db_provider['services'] = array(); + $db_provider['settings'] = $this->ci->db + ->get_where('ea_user_settings', array('id_users' => $provider['id'])) + ->row_array(); unset($db_provider['settings']['id_users']); + $this->ci->unit->run($provider, $db_provider, 'Check if add(update) has successfully ' . 'updated a provider record.'); @@ -358,6 +370,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => '12345', 'notes' => 'This is a test provider', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'test_prov', 'password' => 'test_prov', @@ -389,6 +402,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => '12345', 'notes' => 'This is a test provider', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'test_prov', 'password' => 'test_prov', @@ -419,6 +433,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => '12345', 'notes' => 'This is a test provider', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'test_prov', 'password' => 'test_prov', @@ -449,6 +464,7 @@ class Unit_tests_providers_model extends CI_Driver { 'zip_code' => '12345', 'notes' => 'This is a test provider', 'id_roles' => $this->provider_role_id, + 'services' => array(), 'settings' => array( 'username' => 'test_prov', 'password' => 'test_prov', @@ -505,6 +521,8 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->db->insert('ea_users', $provider); $provider['id'] = intval($this->ci->db->insert_id()); + $provider['services'] = array(); + $provider['settings'] = array( 'id_users' => $provider['id'], 'username' => 'test-prov', @@ -579,6 +597,8 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->db->insert('ea_users', $provider); $provider['id'] = $this->ci->db->insert_id(); + $provider['services'] = array(); + $provider['settings'] = array( 'id_users' => $provider['id'], 'username' => 'testprov', @@ -594,9 +614,13 @@ class Unit_tests_providers_model extends CI_Driver { unset($provider['settings']['id_users']); // Check if get_row() will successfully return the record. - $no_model_provider = $this->ci->db->get_where('ea_users', array('id' => $provider['id']))->row_array(); - $no_model_provider['settings'] = $this->ci->db->get_where('ea_user_settings', - array('id_users' => $provider['id']))->row_array(); + $no_model_provider = $this->ci->db + ->get_where('ea_users', array('id' => $provider['id'])) + ->row_array(); + $no_model_provider['services'] = array(); + $no_model_provider['settings'] = $this->ci->db + ->get_where('ea_user_settings', array('id_users' => $provider['id'])) + ->row_array(); unset($no_model_provider['settings']['id_users']); $model_provider = $this->ci->providers_model->get_row($provider['id']); @@ -604,8 +628,6 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->unit->run($no_model_provider, $model_provider, 'Test get_row() method successfully ' . 'returned provider record.'); - - // Delete inserted provider record. $this->ci->db->delete('ea_users', array('id' => $provider['id'])); } @@ -619,8 +641,6 @@ class Unit_tests_providers_model extends CI_Driver { } catch (Exception $exc) { $has_thrown_exc = TRUE; } - - $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_row() with record id that does ' . 'not exist in the database has thrown an exception.'); } @@ -711,25 +731,38 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->db->delete('ea_users', array('id' => $provider['id'])); } - // TEST GET BATCH METHOD --------------------------------------------- + // TEST GET BATCH METHOD private function test_get_batch() { // Get all the provider rows without using the model. - $db_data = $this->ci->db->get_where('ea_users', - array('id_roles' => $this->provider_role_id))->result_array(); + $db_data = $this->ci->db + ->get_where('ea_users', array('id_roles' => $this->provider_role_id)) + ->result_array(); + foreach($db_data as &$db_provider) { - $db_provider['settings'] = $this->ci->db->get_where('ea_user_settings', - array('id_users' => $db_provider['id']))->row_array(); + $services = $this->ci->db + ->get_where('ea_services_providers', array('id_users' => $db_provider['id'])) + ->result_array(); + $db_provider['services'] = array(); + foreach($services as $service) { + $db_provider['services'][] = $service['id_services']; + } + + + $db_provider['settings'] = $this->ci->db + ->get_where('ea_user_settings', array('id_users' => $db_provider['id'])) + ->row_array(); unset($db_provider['settings']['id_users']); } // Get all the provider rows by using the model. $model_data = $this->ci->providers_model->get_batch(); + // Check that the two arrays are the same. $this->ci->unit->run($db_data, $model_data, 'Test get_batch() method.'); } private function test_get_batch_with_where_clause() { - // Insert new provider record. + // Insert new provider record and try to fetch it. $provider = array( 'last_name' => 'Doe', 'first_name' => 'John', @@ -743,27 +776,52 @@ class Unit_tests_providers_model extends CI_Driver { $this->ci->db->insert('ea_users', $provider); $provider['id'] = intval($this->ci->db->insert_id()); - // Get data without using the model. - $no_model_data = $this->ci->db->get_where('ea_users', array('id' => $provider['id'])) + $settings = array( + 'id_users' => $provider['id'], + 'username' => 'testprov', + 'password' => 'testprov', + 'notifications' => FALSE, + 'working_plan' => $this->default_working_plan, + 'google_sync' => FALSE, + 'google_token' => NULL, + 'sync_past_days' => '5', + 'sync_future_days' => '5' + ); + $this->ci->db->insert('ea_user_settings', $settings); + + // Get provider records without using the model. + $no_model_batch = $this->ci->db + ->get_where('ea_users', array('id' => $provider['id'])) ->result_array(); - foreach($no_model_data as &$no_model_provider) { - $no_model_provider['settings'] = $this->ci->db->get_where('ea_user_settings', - array('id_users' => $no_model_provider['id']))->row_array(); + + foreach($no_model_batch as &$no_model_provider) { + $services = $this->ci->db + ->get_where('ea_services_providers', array('id_users' => $provider['id'])) + ->result_array(); + $no_model_provider['services'] = array(); + foreach($services as $service) { + $no_model_provider['services'][] = $service['id_services']; + } + + + $no_model_provider['settings'] = $this->ci->db + ->get_where('ea_user_settings', array('id_users' => $no_model_provider['id'])) + ->row_array(); unset($no_model_provider['settings']['id_users']); } // Get data by using the model. - $model_data = $this->ci->providers_model->get_batch(array('id' => $provider['id'])); + $model_batch = $this->ci->providers_model->get_batch(array('id' => $provider['id'])); // Check that the data arrays are the same. - $this->ci->unit->run($no_model_data, $model_data, 'Test get_batch() with where clause.'); + $this->ci->unit->run($no_model_batch, $model_batch, 'Test get_batch() with where clause.'); // Delete inserted record from database. $this->ci->db->delete('ea_users', array('id' => $provider['id'])); } private function unabled_test_get_batch_with_invalid_where_clause() { - // CodeIgniter auto raises an exception if the where section is invalid. + // CodeIgniter auto raises an exception if the where clause is invalid. } } diff --git a/src/application/libraries/Unit_tests/drivers/Unit_tests_secretaries_model.php b/src/application/libraries/Unit_tests/drivers/Unit_tests_secretaries_model.php new file mode 100644 index 00000000..2c7b4880 --- /dev/null +++ b/src/application/libraries/Unit_tests/drivers/Unit_tests_secretaries_model.php @@ -0,0 +1,441 @@ +ci =& get_instance(); + $this->ci->load->library('Unit_test'); + $this->ci->load->model('secretaries_model'); + + $this->secretary_role_id = $this->ci->db->get_where('ea_roles', + array('slug' => DB_SLUG_SECRETARY))->row()->id; + + $this->default_secretary = array( + 'first_name' => 'John', + 'last_name' => 'Doe', + 'email' => 'john@doe.com', + 'mobile_number' => '2340982039', + 'phone_number' => '9098091234', + 'address' => 'Some Street 80', + 'city' => 'Some City', + 'state' => 'Some State', + 'zip_code' => '12345', + 'notes' => 'This is a test secretary user.', + 'id_roles' => $this->secretary_role_id + ); + } + + /** + * Run all the available tests + */ + public function run_all() { + // All the methods whose names start with "test" are going to be + // executed. If you want a method to not be executed remove the + // "test" keyword from the beginning. + $class_methods = get_class_methods('Unit_tests_secretaries_model'); + foreach ($class_methods as $method_name) { + if (substr($method_name, 0, 5) === 'test_') { + call_user_func(array($this, $method_name)); + } + } + } + + ///////////////////////////////////////////////////////////////////////// + // UNIT TESTS + ///////////////////////////////////////////////////////////////////////// + // TEST ADD METHOD ------------------------------------------------------ + private function test_add_insert() { + $secretary = $this->default_secretary; + $secretary['providers'] = array(); + $secretary['id'] = $this->ci->secretaries_model->add($secretary); + + $this->ci->unit->run($secretary['id'], 'is_int', 'Test if add() - insert operation - ' + . 'has returned and integer value.'); + + $db_secretary = $this->ci->db->get_where('ea_users', array('id' => $secretary['id']))->row_array(); + $this->ci->unit->run($secretary, $db_secretary, 'Test if add() - insert operation - ' + . 'has successfully inserted a new record.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + + private function test_add_update() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $secretary['first_name'] = 'value changed'; + $secretary['last_name'] = 'value changed'; + $secretary['email'] = 'value@changed.com'; + $secretary['mobile_number'] = 'value changed'; + $secretary['phone_number'] = 'value changed'; + $secretary['address'] = 'value changed'; + $secretary['city'] = 'value changed'; + $secretary['state'] = 'value changed'; + $secretary['zip_code'] = 'value changed'; + $secretary['notes'] = 'value changed'; + + $secretary['providers'] = array(); + + $update_result = $this->ci->secretaries_model->add($secretary); + $this->ci->unit->run($update_result, 'is_int', 'Test if add() - update operation - has ' + . 'returned an integer value.'); + + $db_secretary = $this->ci->db->get_where('ea_users', array('id' => $secretary['id']))->row_array(); + $this->ci->unit->run($secretary, $db_secretary, 'Test if add() - update operation - has ' + . 'successfully updated the secretary record.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + + private function test_add_invalid_data() { + $secretary = $this->default_secretary; + $secretary['email'] = 'this value is invalid'; + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->add($secretary); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if add() has thrown exception ' + . 'on invalid data.'); + } + + private function test_add_using_find_record_id() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary_id = intval($this->ci->db->insert_id()); + + // since $secretary array does not contain an 'id'value but + // exists in the database, the find_record_id() method is going + // to be used inside the method to find the secretary id. + + $secretary['last_name'] = 'updated value'; + $secretary['providers'] = array(); + $update_result = $this->ci->secretaries_model->add($secretary); + $this->ci->unit->run($update_result, 'is_int', 'Test if add() - update operation - has ' + . 'returned and integer value.'); + + $db_secretary = $this->ci->db->get_where('ea_users', array('id' => $secretary_id))->row_array(); + unset($db_secretary['id']); + $this->ci->unit->run($secretary, $db_secretary, 'Test if add() - update operation - has ' + . 'successfully updated the secretary record using find_record_id() method ' + . 'internally.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary_id)); + } + + // TEST EXISTS METHOD ----------------------------------------------------- + private function test_exists_record_exists() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $exists = $this->ci->secretaries_model->exists($secretary); + $this->ci->unit->run($exists, TRUE, 'Test if exists() has returned TRUE with record ' + . 'that exists.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + + private function test_exists_record_does_not_exist() { + $secretary = $this->default_secretary; + $exists = $this->ci->secretaries_model->exists($secretary); + $this->ci->unit->run($exists, FALSE, 'Test if exists() has returned FALSE with record ' + . 'that does not exists.'); + } + + private function test_exists_invalid_argument() { + $secretary = $this->default_secretary; + unset($secretary['email']); + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->exists($secretary); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if exists() has thrown exception with ' + . 'invalid argument (missing email).'); + } + + // TEST FIND RECORD ID METHOD --------------------------------------------- + private function test_find_record_id_record_exists() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $model_id = $this->ci->secretaries_model->find_record_id($secretary); + + $this->ci->unit->run($model_id, 'is_int', 'Test if find_record_id() has returned ' + . 'an integer valuel.'); + + $this->ci->unit->run($secretary['id'], $model_id, 'Test if find_record_id() has ' + . 'successfully found the selected record id'); + + $this->ci->db->delete('ea_users', array('id' => $model_id)); + } + + private function test_find_record_id_record_does_not_exist() { + $secretary = $this->default_secretary; + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->find_record_id($secretary); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if find_record_id() has thrown ' + . 'exception on record that does not exist.'); + } + + private function test_find_record_id_invalid_argument() { + $secretary = $this->default_secretary; + unset($secretary['email']); + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->find_record_id($secretary); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if find_record_id() has thrown ' + . 'exception on invalid argument given (missing email value).'); + } + + // TEST VALIDATE METHOD --------------------------------------------------- + private function test_validate() { + $secretary = $this->default_secretary; + $validation_result = $this->ci->secretaries_model->validate($secretary); + $this->ci->unit->run($validation_result, TRUE, 'Test if validate() has returned TRUE ' + . 'on valid secretary data.'); + + } + + private function test_validate_provided_id_does_not_exist() { + $secretary = $this->default_secretary; + $secretary['id'] = 'This id does not exist in database.'; + + $validation_result = $this->ci->secretaries_model->validate($secretary); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has ' + . 'returned FALSE on invalid data (provided id not exists in db).'); + } + + private function test_validate_invalid_users_value_data_type() { + $secretary = $this->default_secretary; + $secretary['providers'] = 'This is not an array'; + + $validation_result = $this->ci->secretaries_model->validate($secretary); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has ' + . 'returned FALSE on invalid data (users value is not an array).'); + } + + private function test_validate_missing_required_field_values() { + $secretary = $this->default_secretary; + unset($secretary['last_name']); + unset($secretary['email']); + unset($secretary['phone_number']); + + $validation_result = $this->ci->secretaries_model->validate($secretary); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has ' + . 'returned FALSE on invalid data (missing required field values).'); + } + + private function test_validate_invalid_email_address() { + $secretary = $this->default_secretary; + $secretary['email'] = 'This is invalid.'; + + $validation_result = $this->ci->secretaries_model->validate($secretary); + $this->ci->unit->run($validation_result, FALSE, 'Test if validate() has ' + . 'returned FALSE on invalid data (invalid email address).'); + } + + // TEST DELETE METHOD ----------------------------------------------------- + private function test_delete() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $delete_result = $this->ci->secretaries_model->delete($secretary['id']); + $this->ci->unit->run($delete_result, TRUE, 'Test if delete() method has returned TRUE ' + . 'successfull deletion.'); + + $num_rows = $this->ci->db->get_where('ea_users', array('id' => $secretary['id']))->num_rows(); + $this->ci->unit->run($num_rows, 0, 'Test if delete() method has successfully deleted ' + . 'the secretary record.'); + + if ($num_rows > 0) { + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + } + + private function test_delete_invalid_argument() { + $invalid_id = 'This is invalid'; + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->delete($invalid_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if delete() has thrown exception on ' + . 'invalid argument given.'); + } + + private function test_delete_record_does_not_exist() { + $random_id = 23420930923; // no record exists with this id + $delete_result = $this->ci->secretaries_model->delete($random_id); + $this->ci->unit->run($delete_result, FALSE, 'Test if delete() method has returned FALSE ' + . 'when trying to delete a record that does not exist.'); + } + + // TEST GET ROW METHOD ---------------------------------------------------- + private function test_get_row() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $model_secretary = $this->ci->secretaries_model->get_row($secretary['id']); + unset($model_secretary['providers']); + + $this->ci->unit->run($secretary, $model_secretary, 'Test if get_row() has successfully ' + . 'returned the secretary record.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + + private function test_get_row_invalid_argument() { + $invalid_id = 'this is invalid'; + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->get_row($invalid_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_row() has thrown exception ' + . 'on invalid argument given.'); + } + + private function test_get_row_record_does_not_exist() { + $random_id = 2309203923; // no record exists with this id. + $model_secretary = $this->ci->secretaries_model->get_row($random_id); + $this->ci->unit->run($model_secretary, array(), 'Test if get_row() has returned an empty ' + . 'array on record that does not exist.'); + } + + // TEST GET VALUE METHOD -------------------------------------------------- + private function test_get_value() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $field_name = 'last_name'; + + $last_name = $this->ci->secretaries_model->get_value($field_name, $secretary['id']); + $this->ci->unit->run($secretary['last_name'], $last_name, 'Test if get_value() has ' + . 'successfully returned the correct value.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } + + private function test_get_value_invalid_field_name() { + $field_name = 23423452342; // this is invalid + $secretary_id = 1; // random pick + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->get_value($field_name, $secretary_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown exception ' + . 'on invalid field name.'); + } + + private function test_get_value_invalid_record_id() { + $field_name = 'last_name'; // random pick + $secretary_id = 'this is invalid'; + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->get_value($field_name, $secretary_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown exception ' + . 'on invalid record id.'); + } + + private function test_get_value_record_does_not_exist() { + $field_name = 'last_name'; + $secretary_id = 23092093233; // this record does not exist + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->get_value($field_name, $secretary_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown exception ' + . 'on record does not exist.'); + } + + private function test_get_value_field_does_not_exist() { + $field_name = 'this field name does not exist'; + $secretary_id = 23; // random pick + + $has_thrown_exc = FALSE; + try { + $this->ci->secretaries_model->get_value($field_name, $secretary_id); + } catch (Exception $exc) { + $has_thrown_exc = TRUE; + } + $this->ci->unit->run($has_thrown_exc, TRUE, 'Test if get_value() has thrown exception ' + . 'on field name does not exist.'); + } + + // TEST GET BATCH METHOD -------------------------------------------------- + private function test_get_batch() { + $model_batch = $this->ci->secretaries_model->get_batch(); + foreach ($model_batch as &$secretary) { + if (isset($secretary['providers'])) { + unset($secretary['providers']); // will not be included in the test + } + } + + $no_model_batch = $this->ci->db->get_where('ea_users', + array('id_roles' => $this->secretary_role_id))->result_array(); + + $this->ci->unit->run($model_batch, $no_model_batch, 'Test if get_batch() has ' + . 'returned the correct results.'); + } + + private function test_get_batch_where_clause() { + $secretary = $this->default_secretary; + $this->ci->db->insert('ea_users', $secretary); + $secretary['id'] = intval($this->ci->db->insert_id()); + + $model_batch = $this->ci->secretaries_model->get_batch(array('id' => $secretary['id'])); + foreach ($model_batch as &$tmp_secretary) { + if (isset($tmp_secretary['providers'])) { + unset($tmp_secretary['providers']); // will not be included in the test + } + } + + $no_model_batch = $this->ci->db->get_where('ea_users', array('id' => $secretary['id']))->result_array(); + + $this->ci->unit->run($model_batch, $no_model_batch, 'Test if get_batch() with where clause ' + . 'has returned the correct results.'); + + $this->ci->db->delete('ea_users', array('id' => $secretary['id'])); + } +} + + +/* End of file Unit_tests_secretaries_model.php */ +/* Location: ./application/libraries/Unit_tests/drivers/Unit_tests_secretaries_model.php */ \ No newline at end of file diff --git a/src/application/models/admins_model.php b/src/application/models/admins_model.php index c96cdd4c..f7635aee 100644 --- a/src/application/models/admins_model.php +++ b/src/application/models/admins_model.php @@ -27,7 +27,7 @@ class Admins_Model extends CI_Model { } /** - * Add (insert or update) a admin user record into database. + * Add (insert or update) an admin user record into database. * * @param array $admin Contains the admin user data. * @return int Returns the record id. @@ -48,7 +48,7 @@ class Admins_Model extends CI_Model { $admin['id'] = $this->update($admin); } - return intval($admin); + return intval($admin['id']); } /** @@ -69,7 +69,7 @@ class Admins_Model extends CI_Model { ->select('*') ->from('ea_users') ->join('ea_roles', 'ea_roles.id = ea_users.id_roles', 'inner') - ->where('ea_users.email', $provider['email']) + ->where('ea_users.email', $admin['email']) ->where('ea_roles.slug', DB_SLUG_ADMIN) ->get()->num_rows(); @@ -110,9 +110,9 @@ class Admins_Model extends CI_Model { } /** - * Find the database record id of a provider. + * Find the database record id of an admin user. * - * @param array $admin Contains the admin data. The 'email value is required in order to + * @param array $admin Contains the admin data. The 'email' value is required in order to * find the record id. * @return int Returns the record id * @throws Exception When the 'email' value is not present on the $admin array. @@ -191,7 +191,7 @@ class Admins_Model extends CI_Model { // There must be always at least one admin user. If this is the only admin // the system, it cannot be deleted. $admin_count = $this->db->get_where('ea_users', - array('id_roles' => $this->get_admin_roles_id()))->num_rows(); + array('id_roles' => $this->get_admin_role_id()))->num_rows(); if ($admin_count == 1) { throw new Exception('Record could not be deleted. The system requires at least ' . 'one admin user.'); @@ -266,13 +266,15 @@ class Admins_Model extends CI_Model { * @return array Returns an array with admin records. */ public function get_batch($where_clause = '') { + $role_id = $this->get_admin_role_id(); + if ($where_clause != '') { $this->db->where($where_clause); } - $this->db->where('id_roles', $this->get_admin_role_id()); + $this->db->where('id_roles', $role_id); + $batch = $this->db->get('ea_users')->result_array(); - $batch = $this->get('ea_users')->result_array(); return $batch; } diff --git a/src/application/models/providers_model.php b/src/application/models/providers_model.php index 10928d06..83232f9c 100644 --- a/src/application/models/providers_model.php +++ b/src/application/models/providers_model.php @@ -329,19 +329,23 @@ class Providers_Model extends CI_Model { * * @example $this->Model->get_batch('id = ' . $recordId); * - * @param string $where_clause (OPTIONAL) The WHERE clause of the query to be executed. + * @param mixed $where_clause (OPTIONAL) The WHERE clause of the query to be executed. * * NOTICE: DO NOT INCLUDE 'WHERE' KEYWORD. * * @return array Returns the rows from the database. */ public function get_batch($where_clause = '') { + // CI db class may confuse two where clauses made in the same time, so + // get the role id first and then apply the get_batch() where clause. + $role_id = $this->get_providers_role_id(); + if ($where_clause != '') { $this->db->where($where_clause); } $batch = $this->db->get_where('ea_users', - array('id_roles' => $this->get_providers_role_id()))->result_array(); + array('id_roles' => $role_id))->result_array(); // Include each provider sevices and settings. foreach($batch as &$provider) { @@ -408,8 +412,8 @@ class Providers_Model extends CI_Model { * * @return int Returns the role id for the provider records. */ - public function get_providers_role_id() { - return $this->db->get_where('ea_roles', array('slug' => DB_SLUG_PROVIDER))->row()->id; + public function get_providers_role_id() { + return $this->db->get_where('ea_roles', array('slug' => DB_SLUG_PROVIDER))->row()->id; } /** @@ -485,7 +489,7 @@ class Providers_Model extends CI_Model { } // Save provider services in the database (delete old records and add new). - $this->db->delete('ea_services_records', array('id_users' => $provider_id)); + $this->db->delete('ea_services_providers', array('id_users' => $provider_id)); foreach($services as $service_id) { $service_provider = array( 'id_users' => $provider_id, diff --git a/src/application/models/secretaries_model.php b/src/application/models/secretaries_model.php index 1fe27af0..11d8837b 100644 --- a/src/application/models/secretaries_model.php +++ b/src/application/models/secretaries_model.php @@ -1,6 +1,25 @@ > array with provider ids that the secretary handles + */ +class Secretaries_Model extends CI_Model { /** * Class Constructor */ @@ -8,47 +27,301 @@ class Admins_Model extends CI_Model { parent::__construct(); } + /** + * Add (insert or update) a secretary user record into database. + * + * @param array $secretary Contains the secretary user data. + * @return int Returns the record id. + * @throws Exception When the secretary data are invalid (see validate() method). + */ public function add($secretary) { + if (!$this->validate($secretary)) { + throw new Exception('Secretary data are invalid: ' . print_r($secretary, TRUE)); + } + if ($this->exists($secretary) && !isset($secretary['id'])) { + $secretary['id'] = $this->find_record_id($secretary); + } + + if (!isset($secretary['id'])) { + $secretary['id'] = $this->insert($secretary); + } else { + $secretary['id'] = $this->update($secretary); + } + + return intval($secretary['id']); } + /** + * Check whether a particular secretary record exists in the database. + * + * @param array $secretary Contains the secretary data. The 'email' value is required to + * be present at the moment. + * @return bool Returns whether the record exists or not. + * @throws Exception When the 'email' value is not present on the $secretary argument. + */ public function exists($secretary) { + if (!isset($secretary['email'])) { + throw new Exception('Secretary email is not provided: ' . print_r($secretary, TRUE)); + } + // This method shouldn't depend on another method of this class. + $num_rows = $this->db + ->select('*') + ->from('ea_users') + ->join('ea_roles', 'ea_roles.id = ea_users.id_roles', 'inner') + ->where('ea_users.email', $secretary['email']) + ->where('ea_roles.slug', DB_SLUG_SECRETARY) + ->get()->num_rows(); + + return ($num_rows > 0) ? TRUE : FALSE; } + /** + * Insert a new sercretary record into the database. + * + * @param array $secretary Contains the secretary data. + * @return int Returns the new record id. + * @throws Exception When the insert operation fails. + */ public function insert($secretary) { + $providers = $secretary['providers']; + unset($secretary['providers']); + + $secretary['id_roles'] = $this->get_secretary_role_id(); + if (!$this->db->insert('ea_users', $secretary)) { + throw new Exception('Could not insert secretary into the database.'); + } + + $secretary['id'] = intval($this->db->insert_id()); + + $this->save_providers($providers,$secretary['id']); + + return $secretary['id']; } + /** + * Update an existing secretary record in the database. + * + * @param array $secretary Contains the secretary record data. + * @return int Retuns the record id. + * @throws Exception When the update operation fails. + */ public function update($secretary) { + $providers = $secretary['providers']; + unset($secretary['providers']); + $this->db->where('id', $secretary['id']); + if (!$this->db->update('ea_users', $secretary)){ + throw new Exception('Could not update secretary record.'); + } + + $this->save_providers($providers, $secretary['id']); + + return intval($secretary['id']); } + /** + * Find the database record id of a secretary. + * + * @param array $secretary Contains the secretary data. The 'email' value is required + * in order to find the record id. + * @return int Returns the record id + * @throws Exception When the 'email' value is not present on the $secretary array. + */ public function find_record_id($secretary) { + if (!isset($secretary['email'])) { + throw new Exception('Secretary email was not provided: ' . print_r($secretary, TRUE)); + } + $result = $this->db + ->select('ea_users.id') + ->from('ea_users') + ->join('ea_roles', 'ea_roles.id = ea_users.id_roles', 'inner') + ->where('ea_users.email', $secretary['email']) + ->where('ea_roles.slug', DB_SLUG_SECRETARY) + ->get(); + + if ($result->num_rows() == 0) { + throw new Exception('Could not find secretary record id.'); + } + + return intval($result->row()->id); } + /** + * Validate secretary user data before add() operation is executed. + * + * @param array $secretary Contains the secretary user data. + * @return bool Returns the validation result. + */ public function validate($secretary) { + $this->load->helper('data_validation'); + try { + // If a record id is provided then check whether the record exists in the database. + if (isset($secretary['id'])) { + $num_rows = $this->db->get_where('ea_users', array('id' => $secretary['id'])) + ->num_rows(); + if ($num_rows == 0) { + throw new Exception('Given secretary id does not exist in database: ' . $secretary['id']); + } + } + + // Validate 'providers' value datatype (must be array) + if (isset($secretary['provders']) && !is_array($secretary['providers'])) { + throw new Exception('Secretary providers value is not an array.'); + } + + // Validate required fields integrity. + if (!isset($secretary['last_name']) + || !isset($secretary['email']) + || !isset($secretary['phone_number'])) { + throw new Exception('Not all required fields are provided : ' . print_r($secretary, TRUE)); + } + + // Validate secretary email address. + if (!filter_var($secretary['email'], FILTER_VALIDATE_EMAIL)) { + throw new Exception('Invalid email address provided : ' . $secretary['email']); + } + + return TRUE; + } catch (Exception $exc) { + return FALSE; + } } - public function delete($secretary) { + /** + * Delete an existing secretary record from the database. + * + * @param numeric $secretary_id The secretary record id to be deleted. + * @return bool Returns the delete operation result. + * @throws Exception When the $secretary_id is not a valid numeric value. + */ + public function delete($secretary_id) { + if (!is_numeric($secretary_id)) { + throw new Exception('Invalid argument type $secretary_id : ' . $secretary_id); + } + + $num_rows = $this->db->get_where('ea_users', array('id' => $secretary_id))->num_rows(); + if ($num_rows == 0) { + return FALSE; // Record does not exist in database. + } + return $this->db->delete('ea_users', array('id' => $secretary_id)); } + /** + * Get a specific secretary record from the database. + * + * @param numeric $secretary_id The id of the record to be returned. + * @return array Returns an array with the secretary user data. + * @throws Exception When the $secretary_id is not a valid numeric value. + */ public function get_row($secretary_id) { + if (!is_numeric($secretary_id)) { + throw new Exception('$secretary_id argument is not a valid numeric value: ' . $secretary_id); + } + $secretary = $this->db->get_where('ea_users', array('id' => $secretary_id))->row_array(); + $secretary['providers'] = $this->db->get_where('ea_secretaries_providers', + array('id_users_secretary' => $secretary_id))->result_array(); + + return $secretary; } + /** + * Get a specific field value from the database. + * + * @param string $field_name The field name of the value to be returned. + * @param numeric $secretary_id Record id of the value to be returned. + * @return string Returns the selected record value from the database. + * @throws Exception When the $field_name argument is not a valid string. + * @throws Exception When the $secretary_id is not a valid numeric. + * @throws Exception When the secretary record does not exist in the database. + * @throws Exception When the selected field value is not present on database. + */ public function get_value($field_name, $secretary_id) { + if (!is_string($field_name)) { + throw new Exception('$field_name argument is not a string : ' . $field_name); + } + if (!is_numeric($secretary_id)) { + throw new Exception('$secretary_id argument is not a valid numeric value: ' . $secretary_id); + } + + // Check whether the secretary record exists. + $result = $this->db->get_where('ea_users', array('id' => $secretary_id)); + if ($result->num_rows() == 0) { + throw new Exception('The record with the given id does not exist in the ' + . 'database : ' . $secretary_id); + } + + // Check if the required field name exist in database. + $provider = $result->row_array(); + if (!isset($provider[$field_name])) { + throw new Exception('The given $field_name argument does not exist in the ' + . 'database: ' . $field_name); + } + + return $provider[$field_name]; } + /** + * Get all, or specific secretary records from database. + * + * @param string|array $where_clause (OPTIONAL) The WHERE clause of the query to be executed. + * Use this to get specific secretary records. + * @return array Returns an array with secretary records. + */ public function get_batch($where_clause = '') { + $role_id = $this->get_secretary_role_id(); + if ($where_clause != '') { + $this->db->where($where_clause); + } + + $this->db->where('id_roles', $role_id); + $batch = $this->db->get('ea_users')->result_array(); + + // Include every secretary handling users. + foreach ($batch as &$secretary) { + $secretary['providers'] = $this->db->get_where('ea_secretaries_providers', + array('id_users_secretary' => $secretary['id']))->result_array(); + } + + return $batch; } + /** + * Get the secretary users role id. + * + * @return int Returns the role record id. + */ + public function get_secretary_role_id() { + return intval($this->db->get_where('ea_roles', array('slug' => DB_SLUG_SECRETARY))->row()->id); + } + /** + * Save a secretary hasndling users. + * @param array $providers Contains the provider ids that are handled by the secretary. + * @param numeric $secretary_id The selected secretary record. + */ + private function save_providers($providers, $secretary_id) { + if (!is_array($providers)) { + throw new Exception('Invalid argument given $providers: ' . print_r($providers, TRUE)); + } + + if (count($providers) > 0) { + foreach ($providers as $provider_id) { + $this->db->insert('ea_secretaries_providers', array( + 'id_users_secretary' => $secretary_id, + 'id_users_provider' => $provider_id + )); + } + } + } } /* End of file secretaries_model.php */