From 17ceed1c9155e8b725332c9b6ba671e6dde618ee Mon Sep 17 00:00:00 2001 From: jvelilla Date: Thu, 18 Sep 2014 21:00:08 -0300 Subject: [PATCH] Added node collaborators, author. Added test cases. --- .../mysql/src/provider/node_data_provider.e | 105 ++++++++++++++++++ .../implementation/mysql/tests/application.e | 82 +++++++++----- .../mysql/tests/nodes/node_test_set.e | 50 ++++++++- .../mysql/tests/users/user_test_set.e | 2 +- .../mysql/tests/util/clean_db.e | 10 +- 5 files changed, 220 insertions(+), 29 deletions(-) diff --git a/persistence/implementation/mysql/src/provider/node_data_provider.e b/persistence/implementation/mysql/src/provider/node_data_provider.e index eef4756..7b63544 100644 --- a/persistence/implementation/mysql/src/provider/node_data_provider.e +++ b/persistence/implementation/mysql/src/provider/node_data_provider.e @@ -197,6 +197,80 @@ feature -- Basic operations post_execution end +feature -- Basic Operations: User_Nodes + + add_author (a_user_id: INTEGER_64; a_node_id: INTEGER_64) + -- Add author `a_user_id' to node `a_node_id' + local + l_parameters: STRING_TABLE [detachable ANY] + do + log.write_information (generator + ".add_author") + create l_parameters.make (2) + l_parameters.put (a_user_id,"user_id") + l_parameters.put (a_node_id,"id") + db_handler.set_query (create {DATABASE_QUERY}.data_reader (Sql_update_node_author, l_parameters)) + db_handler.execute_change + post_execution + end + + add_collaborator (a_user_id: INTEGER_64; a_node_id: INTEGER_64) + -- Add collaborator `a_user_id' to node `a_node_id' + local + l_parameters: STRING_TABLE [detachable ANY] + do + log.write_information (generator + ".add_collaborator") + create l_parameters.make (2) + l_parameters.put (a_user_id,"users_id") + l_parameters.put (a_node_id,"nodes_id") + db_handler.set_query (create {DATABASE_QUERY}.data_reader (Sql_insert_users_nodes, l_parameters)) + db_handler.execute_change + post_execution + end + + user_nodes (a_id:INTEGER_64): DATABASE_ITERATION_CURSOR [CMS_NODE] + -- List of Nodes for the given user `a_id'. (the user is the author of the node) + local + l_parameters: STRING_TABLE [ANY] + do + log.write_information (generator + ".user_nodes") + create l_parameters.make (1) + l_parameters.put (a_id, "user_id") + db_handler.set_query (create {DATABASE_QUERY}.data_reader (Select_user_author, l_parameters)) + db_handler.execute_query + create Result.make (db_handler, agent fetch_node) + post_execution + end + + node_author (a_id: INTEGER_64): detachable CMS_USER + -- Node's author for the given node id. + local + l_parameters: STRING_TABLE [ANY] + do + log.write_information (generator + ".node_author") + create l_parameters.make (1) + l_parameters.put (a_id, "node_id") + db_handler.set_query (create {DATABASE_QUERY}.data_reader (select_node_author, l_parameters)) + db_handler.execute_query + if not db_handler.after then + Result := fetch_user + end + post_execution + end + + node_collaborators (a_id: INTEGER_64): DATABASE_ITERATION_CURSOR [CMS_USER] + -- List of possible node's collaborator. + local + l_parameters: STRING_TABLE [ANY] + do + log.write_information (generator + ".node_collaborators") + create l_parameters.make (1) + l_parameters.put (a_id, "node_id") + db_handler.set_query (create {DATABASE_QUERY}.data_reader (select_node_collaborators, l_parameters)) + db_handler.execute_query + create Result.make (db_handler, agent fetch_user) + post_execution + end + feature -- Connection connect @@ -243,6 +317,20 @@ feature {NONE} -- Queries SQL_Delete_node: STRING = "delete from nodes where id=:id;" + Sql_update_node_author: STRING = "update nodes SET author_id=:user_id where id=:id;" + +feature {NONE} -- Sql Queries: USER_ROLES collaborators, author + + Sql_insert_users_nodes: STRING = "insert into users_nodes (users_id, nodes_id) values (:users_id, :nodes_id);" + + select_node_collaborators: STRING = "SELECT * FROM Users INNER JOIN users_nodes ON users.id=users_nodes.users_id and users_nodes.nodes_id = :nodes_id;" + + Select_user_author: STRING = "SELECT * FROM Nodes INNER JOIN users ON nodes.author_id=users.id and users.id = :user_id;" + + Select_node_author: STRING = "SELECT * FROM User INNER JOIN nodes ON nodes.author_id=users.id and node_id =:node_id;" + +feature -- + feature -- New Object @@ -272,6 +360,23 @@ feature -- New Object end end + fetch_user: CMS_USER + do + create Result.make ("") + if attached db_handler.read_integer_32 (1) as l_id then + Result.set_id (l_id) + end + if attached db_handler.read_string (2) as l_u then + Result.set_name (l_u) + end + if attached db_handler.read_string (3) as l_p then + Result.set_password (l_p) + end + if attached db_handler.read_string (5) as l_e then + Result.set_email (l_e) + end + end + feature {NONE} -- Implementation post_execution diff --git a/persistence/implementation/mysql/tests/application.e b/persistence/implementation/mysql/tests/application.e index aade7b5..04417b4 100644 --- a/persistence/implementation/mysql/tests/application.e +++ b/persistence/implementation/mysql/tests/application.e @@ -20,36 +20,68 @@ feature {NONE} -- Initialization user: USER_DATA_PROVIDER node: NODE_DATA_PROVIDER l_security: SECURITY_PROVIDER + l_profile, l_db_profile: CMS_USER_PROFILE + l_cursor: TABLE_ITERATION_CURSOR [READABLE_STRING_8, READABLE_STRING_8] + l_list: LIST[CMS_NODE] do - create connection.login_with_schema ("cms", "root", "") --- create user.make (connection) ----- user.new_user ("jv", "test","test@test.com") - --- if attached user.user (3) as l_user then --- if attached user.user_salt ("jv") as l_salt then --- create l_security --- if attached l_user.password as l_password then --- print (l_password) --- io.put_new_line --- print (l_security.password_hash ("test", l_salt)) - --- check same_string: l_security.password_hash ("test", l_salt).is_case_insensitive_equal (l_password) end --- end --- end --- end - --- if attached user.user_by_name ("jv") as l_user then --- check l_user.id = 3 end --- end - + create connection.login_with_schema ("cms_dev", "root", "") + create user.make (connection) create node.make (connection) - across node.recent_nodes (0, 5) as c loop - print (c.item) + (create {CLEAN_DB}).clean_db(connection) + + user.new_user ("test", "test","test@admin.com") + if attached {CMS_USER} user.user_by_name ("test") as l_user then + create l_profile.make + l_profile.force ("Eiffel", "language") + l_profile.force ("Argentina", "country") + l_profile.force ("GMT-3", "time zone") + user.save_profile (l_user.id, l_profile) + l_db_profile := user.user_profile (l_user.id) + from + l_cursor := l_db_profile.new_cursor + until + l_cursor.after + loop + print (l_cursor.item + " - " + l_cursor.key + "%N") + l_cursor.forth + end + + create {ARRAYED_LIST[CMS_NODE]} l_list.make (0) + node.new_node (default_node) + node.new_node (custom_node ("content1", "summary1", "title1")) + node.new_node (custom_node ("content2", "summary2", "title2")) + node.new_node (custom_node ("content3", "summary3", "title3")) + user.new_user ("u1", "u1", "email") + if attached user.user_by_name ("u1") as ll_user then + node.add_collaborator (l_user.id, 1) + node.add_collaborator (l_user.id, 2) + node.add_collaborator (l_user.id, 3) + node.add_collaborator (l_user.id, 4) + + across node.node_collaborators (1) as c loop + print (c.item.name) + end + + end + + end - - end + +feature {NONE} -- Implementation + connection: DATABASE_CONNECTION_MYSQL + + default_node: CMS_NODE + do + Result := custom_node ("Default content", "default summary", "Default") + end + + custom_node (a_content, a_summary, a_title: READABLE_STRING_32): CMS_NODE + do + create Result.make (a_content, a_summary, a_title) + end + end diff --git a/persistence/implementation/mysql/tests/nodes/node_test_set.e b/persistence/implementation/mysql/tests/nodes/node_test_set.e index 3ae6665..adc87b4 100644 --- a/persistence/implementation/mysql/tests/nodes/node_test_set.e +++ b/persistence/implementation/mysql/tests/nodes/node_test_set.e @@ -5,7 +5,7 @@ note author: "EiffelStudio test wizard" date: "$Date$" revision: "$Revision$" - testing: "type/manual" + testing:"execution/isolated" class NODE_TEST_SET @@ -195,9 +195,49 @@ feature -- Test routines -- Scenrario 10..10 empty assert ("Empty", node_provider.recent_nodes (10, 10).after) - end + + test_new_node_without_user + do + node_provider.new_node (default_node) + user_provider.new_user ("u1", "u1", "email") + if attached user_provider.user_by_name ("u1") as l_user then + assert ("Empty nodes", node_provider.user_nodes (l_user.id).after) + end + end + + + test_new_node_add_author + do + node_provider.new_node (default_node) + user_provider.new_user ("u1", "u1", "email") + if attached user_provider.user_by_name ("u1") as l_user then + node_provider.add_collaborator (l_user.id, 1) + assert ("Not Empty nodes", not node_provider.node_collaborators (1).after) + end + end + + test_multiple_nodes_add_author + local + l_list: LIST[CMS_NODE] + do + create {ARRAYED_LIST[CMS_NODE]} l_list.make (0) + node_provider.new_node (default_node) + node_provider.new_node (custom_node ("content1", "summary1", "title1")) + node_provider.new_node (custom_node ("content2", "summary2", "title2")) + node_provider.new_node (custom_node ("content3", "summary3", "title3")) + user_provider.new_user ("u1", "u1", "email") + if attached user_provider.user_by_name ("u1") as l_user then + node_provider.add_collaborator (l_user.id, 1) + node_provider.add_collaborator (l_user.id, 2) + node_provider.add_collaborator (l_user.id, 3) + node_provider.add_collaborator (l_user.id, 4) + end + end + + + feature {NONE} -- Implementation node_provider: NODE_DATA_PROVIDER @@ -206,6 +246,12 @@ feature {NONE} -- Implementation create Result.make (connection) end + user_provider: USER_DATA_PROVIDER + -- user provider. + once + create Result.make (connection) + end + feature {NONE} -- Implementation Fixture Factories diff --git a/persistence/implementation/mysql/tests/users/user_test_set.e b/persistence/implementation/mysql/tests/users/user_test_set.e index 1f1e049..7768e0e 100644 --- a/persistence/implementation/mysql/tests/users/user_test_set.e +++ b/persistence/implementation/mysql/tests/users/user_test_set.e @@ -5,7 +5,7 @@ note author: "EiffelStudio test wizard" date: "$Date$" revision: "$Revision$" - testing:"execution/serial" + testing:"execution/isolated" class USER_TEST_SET diff --git a/persistence/implementation/mysql/tests/util/clean_db.e b/persistence/implementation/mysql/tests/util/clean_db.e index 6b894ca..965465f 100644 --- a/persistence/implementation/mysql/tests/util/clean_db.e +++ b/persistence/implementation/mysql/tests/util/clean_db.e @@ -33,6 +33,12 @@ feature db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_permissions, l_parameters)) db_handler(a_connection).execute_change + + -- Clean Users Nodes + db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_users_nodes, l_parameters)) + db_handler(a_connection).execute_change + + -- Clean Users Roles db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_users_roles, l_parameters)) db_handler(a_connection).execute_change @@ -96,9 +102,11 @@ feature -- Sql delete queries Sql_delete_users_roles: STRING = "delete from Users_roles" -- Clean User roles. - Sql_delete_user_profiles: STRING = "delete from profiles" + Sql_delete_user_profiles: STRING = "delete from profiles" -- Clean profiles. + Sql_delete_users_nodes: STRING = "delete from users_nodes" + Rest_users_autoincrement: STRING = "ALTER TABLE Users AUTO_INCREMENT = 1" -- reset autoincrement