Fixed persistency layer.
Now we have ODBC .. that accepts various connection string (including SQLite, MySQL,...) And EiffelStore+MySQL. Updated sql scripts to work with MySQL, and SQLite. Added a sql_statement (s: STRING): STRING that converts ROC sql statement to fit the underlying database engine. mostly to adapt incompatibilities such as AUTO_INCREMENT for MySQL and AUTOINCREMENT for SQLite by default SQL script should be written following MySQL SQL syntax. Warning: to use ODBC persistence driver, it has to be installed on the target machine.
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
note
|
||||
description: "Summary description for {CMS_STORAGE_STORE_MYSQL}."
|
||||
date: "$Date: 2015-02-09 22:29:56 +0100 (lun., 09 févr. 2015) $"
|
||||
revision: "$Revision: 96596 $"
|
||||
|
||||
class
|
||||
CMS_STORAGE_STORE_MYSQL
|
||||
|
||||
inherit
|
||||
CMS_STORAGE_STORE_SQL
|
||||
|
||||
CMS_CORE_STORAGE_SQL_I
|
||||
|
||||
CMS_USER_STORAGE_SQL_I
|
||||
|
||||
REFACTORING_HELPER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Status report
|
||||
|
||||
is_initialized: BOOLEAN
|
||||
-- Is storage initialized?
|
||||
do
|
||||
Result := has_user
|
||||
end
|
||||
|
||||
feature -- Conversion
|
||||
|
||||
sql_statement (a_statement: STRING): STRING
|
||||
-- <Precursor>
|
||||
do
|
||||
Result := a_statement
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,48 @@
|
||||
note
|
||||
description: "[
|
||||
Interface responsible to instantiate CMS_STORAGE_STORE_MYSQL object.
|
||||
]"
|
||||
author: "$Author: jfiat $"
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
|
||||
class
|
||||
CMS_STORAGE_STORE_MYSQL_BUILDER
|
||||
|
||||
inherit
|
||||
CMS_STORAGE_STORE_SQL_BUILDER
|
||||
|
||||
GLOBAL_SETTINGS
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Initialize `Current'.
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Factory
|
||||
|
||||
storage (a_setup: CMS_SETUP): detachable CMS_STORAGE_STORE_MYSQL
|
||||
local
|
||||
conn: DATABASE_CONNECTION
|
||||
do
|
||||
if attached (create {APPLICATION_JSON_CONFIGURATION_HELPER}).new_database_configuration (a_setup.environment.application_config_path) as l_database_config then
|
||||
create {DATABASE_CONNECTION_MYSQL} conn.login_with_connection_string (l_database_config.connection_string)
|
||||
if conn.is_connected then
|
||||
create Result.make (conn)
|
||||
set_map_zero_null_value (False) --| This way we map 0 to 0, instead of Null as default.
|
||||
if Result.is_available then
|
||||
if not Result.is_initialized then
|
||||
initialize (a_setup, Result)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
@@ -0,0 +1,115 @@
|
||||
note
|
||||
description: "Object that handle a database connection for ODBC"
|
||||
date: "$Date: 2014-08-20 15:21:15 -0300 (mi., 20 ago. 2014) $"
|
||||
revision: "$Revision: 95678 $"
|
||||
|
||||
class
|
||||
DATABASE_CONNECTION_MYSQL
|
||||
|
||||
inherit
|
||||
|
||||
DATABASE_CONNECTION
|
||||
redefine
|
||||
db_application
|
||||
end
|
||||
|
||||
create
|
||||
login, login_with_default, login_with_database_name, login_with_connection_string, login_with_schema
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
login_with_default
|
||||
-- Create a database handler for MYSQL with common settings.
|
||||
do
|
||||
login_with_database_name (default_database_name)
|
||||
end
|
||||
|
||||
login_with_database_name (a_database_name: STRING)
|
||||
-- Create a database handler and
|
||||
-- set database_name to `a_database_name'.
|
||||
do
|
||||
login (default_username, default_password, default_hostname, a_database_name, is_keep_connection)
|
||||
end
|
||||
|
||||
login (a_username: STRING; a_password: STRING; a_hostname: STRING; a_database_name: STRING; connection: BOOLEAN)
|
||||
|
||||
-- Create a database handler for ODBC and set `username' to `a_username',
|
||||
-- `password' to `a_password'
|
||||
-- `database_name' to `a_database_name'
|
||||
-- `connection' to `a_connection'
|
||||
do
|
||||
create database_error_handler.make
|
||||
create db_application.login (a_username, a_password)
|
||||
db_application.set_hostname (a_hostname)
|
||||
db_application.set_data_source (a_database_name)
|
||||
db_application.set_base
|
||||
create db_control.make
|
||||
keep_connection := connection
|
||||
if keep_connection then
|
||||
connect
|
||||
end
|
||||
end
|
||||
|
||||
login_with_connection_string (a_string: STRING)
|
||||
-- Login with `a_connection_string' and immediately connect to database.
|
||||
local
|
||||
l_server: STRING
|
||||
l_port: STRING
|
||||
l_database: STRING
|
||||
l_user: STRING
|
||||
l_password: STRING
|
||||
do
|
||||
create database_error_handler.make
|
||||
l_server := connection_string_item (a_string, "Server", default_hostname)
|
||||
l_database := connection_string_item (a_string, "Database", default_database_name)
|
||||
l_port := connection_string_item (a_string, "Port", "3306")
|
||||
l_user := connection_string_item (a_string, "Uid", default_username)
|
||||
l_password := connection_string_item (a_string, "Pwd", default_password)
|
||||
|
||||
create db_application
|
||||
db_application.set_application (l_database)
|
||||
db_application.set_hostname (l_server + ":" + l_port)
|
||||
db_application.login_and_connect (l_user, l_password)
|
||||
db_application.set_base
|
||||
create db_control.make
|
||||
keep_connection := is_keep_connection
|
||||
end
|
||||
|
||||
connection_string_item (a_connection_string: STRING; k: STRING; dft: STRING): STRING
|
||||
local
|
||||
i,j: INTEGER
|
||||
do
|
||||
i := a_connection_string.substring_index (k + "=", 1)
|
||||
if i = 0 then
|
||||
i := a_connection_string.substring_index (k.as_lower + "=", 1)
|
||||
end
|
||||
if i > 0 then
|
||||
i := i + k.count + 1
|
||||
j := a_connection_string.index_of (';', i)
|
||||
if j = 0 then
|
||||
j := a_connection_string.count + 1
|
||||
end
|
||||
Result := a_connection_string.substring (i, j - 1)
|
||||
else
|
||||
Result := dft
|
||||
end
|
||||
end
|
||||
|
||||
login_with_schema (a_schema: STRING; a_username: STRING; a_password: STRING)
|
||||
-- Login with `a_connection_string'and immediately connect to database.
|
||||
do
|
||||
create database_error_handler.make
|
||||
create db_application
|
||||
db_application.set_application (a_schema)
|
||||
db_application.login_and_connect (a_username, a_password)
|
||||
db_application.set_base
|
||||
create db_control.make
|
||||
keep_connection := is_keep_connection
|
||||
end
|
||||
|
||||
feature -- Databse Connection
|
||||
|
||||
db_application: DATABASE_APPL [MYSQL]
|
||||
-- Database application.
|
||||
|
||||
end
|
||||
@@ -0,0 +1,35 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="store_mysql" uuid="DC757CBD-D8C4-44D6-A07F-C1148D8D233E" library_target="store_mysql">
|
||||
<target name="store_mysql">
|
||||
<root all_classes="true"/>
|
||||
<option warning="true" void_safety="all">
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="console_application" value="true"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="cms" location="..\..\..\cms-safe.ecf" readonly="false"/>
|
||||
<library name="cms_app_env" location="..\..\app_env\app_env-safe.ecf"/>
|
||||
<library name="crypto" location="$ISE_LIBRARY\unstable\library\text\encryption\crypto\crypto-safe.ecf"/>
|
||||
<library name="encoder" location="$ISE_LIBRARY\contrib\library\web\framework\ewf\text\encoder\encoder-safe.ecf"/>
|
||||
<library name="error" location="$ISE_LIBRARY\contrib\library\utility\general\error\error-safe.ecf"/>
|
||||
<library name="json" location="$ISE_LIBRARY\contrib\library\text\parser\json\library\json-safe.ecf" readonly="false"/>
|
||||
<library name="logging" location="$ISE_LIBRARY\library\runtime\logging\logging-safe.ecf"/>
|
||||
<library name="model" location="..\..\model\cms_model-safe.ecf"/>
|
||||
<library name="mysql" location="$ISE_LIBRARY\library\store\dbms\rdbms\mysql\mysql-safe.ecf"/>
|
||||
<library name="store" location="$ISE_LIBRARY\library\store\store-safe.ecf" readonly="false"/>
|
||||
<library name="thread" location="$ISE_LIBRARY\library\thread\thread-safe.ecf"/>
|
||||
<library name="time" location="$ISE_LIBRARY\library\time\time-safe.ecf"/>
|
||||
<cluster name="common" location="..\implementation\store\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/database/database_connection_odbc.e</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
<cluster name="persistence_store_mysql" location=".\src\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
@@ -0,0 +1,73 @@
|
||||
note
|
||||
description : "tests application root class"
|
||||
date : "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision : "$Revision: 96542 $"
|
||||
|
||||
class
|
||||
APPLICATION
|
||||
|
||||
inherit
|
||||
ARGUMENTS
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature {NONE} -- Initialization
|
||||
|
||||
make
|
||||
-- Run application.
|
||||
local
|
||||
storage: CMS_STORAGE
|
||||
l_node: CMS_NODE
|
||||
do
|
||||
create connection.login_with_schema ("cms_dev", "root", "")
|
||||
|
||||
(create {CLEAN_DB}).clean_db(connection)
|
||||
|
||||
create {CMS_STORAGE_MYSQL} storage.make (connection)
|
||||
l_node := custom_node ("Content", "Summary", "Title")
|
||||
storage.new_user (default_user)
|
||||
storage.new_user (custom_user ("u2", "p2", "e2"))
|
||||
l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_title (2,ll_node.id, "New Title")
|
||||
-- check
|
||||
-- attached {CMS_NODE} storage.node_by_id (1) as u_node and then not (u_node.title ~ ll_node.title) and then u_node.content ~ ll_node.content and then u_node.summary ~ ll_node.summary
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Fixture Factory: Users
|
||||
|
||||
default_user: CMS_USER
|
||||
do
|
||||
Result := custom_user ("test", "password", "test@test.com")
|
||||
end
|
||||
|
||||
custom_user (a_name, a_password, a_email: READABLE_STRING_32): CMS_USER
|
||||
do
|
||||
create Result.make (a_name)
|
||||
Result.set_password (a_password)
|
||||
Result.set_email (a_email)
|
||||
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_PAGE
|
||||
do
|
||||
create Result.make (a_title)
|
||||
Result.set_content (a_content, a_summary, Void)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,81 @@
|
||||
note
|
||||
description: "[
|
||||
Eiffel tests that can be executed by testing tool.
|
||||
]"
|
||||
author: "EiffelStudio test wizard"
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
testing: "type/manual"
|
||||
|
||||
class
|
||||
DATABASE_HANDLER_TEST
|
||||
|
||||
inherit
|
||||
EQA_TEST_SET
|
||||
redefine
|
||||
on_prepare,
|
||||
on_clean
|
||||
select
|
||||
default_create
|
||||
end
|
||||
ABSTRACT_DB_TEST
|
||||
rename
|
||||
default_create as default_db_test
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Events
|
||||
|
||||
on_prepare
|
||||
-- <Precursor>
|
||||
do
|
||||
(create {CLEAN_DB}).clean_db(connection)
|
||||
end
|
||||
|
||||
on_clean
|
||||
-- <Precursor>
|
||||
do
|
||||
end
|
||||
|
||||
|
||||
feature -- Test routines
|
||||
|
||||
test_wrong_database_query
|
||||
-- New test routine
|
||||
local
|
||||
l_parameters: STRING_TABLE[detachable ANY]
|
||||
do
|
||||
create l_parameters.make (0)
|
||||
handler.set_query (create {DATABASE_QUERY}.data_reader ("Sellect from users", l_parameters))
|
||||
handler.execute_query
|
||||
assert ("Has error:", handler.has_error)
|
||||
end
|
||||
|
||||
|
||||
|
||||
test_sequences_of_wrong_and_correct_queries
|
||||
-- New test routine
|
||||
local
|
||||
l_parameters: STRING_TABLE[detachable ANY]
|
||||
do
|
||||
create l_parameters.make (0)
|
||||
handler.set_query (create {DATABASE_QUERY}.data_reader ("Sellect from users;", l_parameters))
|
||||
handler.execute_query
|
||||
assert ("Has error:", handler.has_error)
|
||||
|
||||
handler.set_query (create {DATABASE_QUERY}.data_reader ("Select * from users;", l_parameters))
|
||||
handler.execute_query
|
||||
assert ("Not Has error:",not handler.has_error)
|
||||
end
|
||||
|
||||
|
||||
feature -- Handler
|
||||
|
||||
handler: DATABASE_HANDLER
|
||||
once
|
||||
create {DATABASE_HANDLER_IMPL} Result.make (connection )
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,242 @@
|
||||
note
|
||||
description: "[
|
||||
Eiffel tests that can be executed by testing tool.
|
||||
]"
|
||||
author: "EiffelStudio test wizard"
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
testing:"execution/isolated"
|
||||
|
||||
class
|
||||
NODE_TEST_SET
|
||||
|
||||
inherit
|
||||
EQA_TEST_SET
|
||||
redefine
|
||||
on_prepare,
|
||||
on_clean
|
||||
select
|
||||
default_create
|
||||
end
|
||||
ABSTRACT_DB_TEST
|
||||
rename
|
||||
default_create as default_db_test
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Events
|
||||
|
||||
on_prepare
|
||||
-- <Precursor>
|
||||
do
|
||||
(create {CLEAN_DB}).clean_db (connection)
|
||||
assert ("Empty Nodes", storage.nodes_count = 0)
|
||||
end
|
||||
|
||||
on_clean
|
||||
-- <Precursor>
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Test routines
|
||||
|
||||
test_new_node
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
do
|
||||
assert ("Empty Nodes", storage.nodes_count = 0)
|
||||
storage.new_node (default_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached storage.node_by_id (1))
|
||||
-- Not exist node with id 2
|
||||
assert ("Not exist node with id 2", storage.node_by_id (2) = Void)
|
||||
end
|
||||
|
||||
|
||||
test_update_node
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
l_node: CMS_NODE
|
||||
do
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
l_node := custom_node ("<h1> test node udpate </h1>", "Update node", "Test case update")
|
||||
storage.new_node (l_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_node.content and then ll_node.summary ~ l_node.summary and then ll_node.title ~ l_node.title )
|
||||
|
||||
-- Update node (content and summary)
|
||||
|
||||
if attached {CMS_NODE} storage.node_by_id (1) as l_un then
|
||||
l_un.set_content ("<h1>Updating test node udpate </h1>")
|
||||
l_un.set_summary ("updating summary")
|
||||
storage.update_node (l_un)
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then not (ll_node.content ~ l_node.content) and then not (ll_node.summary ~ l_node.summary) and then ll_node.title ~ l_node.title )
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_un.content and then ll_node.summary ~ l_un.summary and then ll_node.title ~ l_un.title )
|
||||
end
|
||||
|
||||
-- Update node (content and summary and title)
|
||||
if attached {CMS_NODE} storage.node_by_id (1) as l_un then
|
||||
l_un.set_content ("<h1>Updating test node udpate </h1>")
|
||||
l_un.set_summary ("updating summary")
|
||||
l_un.set_title ("Updating Test case")
|
||||
storage.update_node (l_un)
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then not (ll_node.content ~ l_node.content) and then not (ll_node.summary ~ l_node.summary) and then not (ll_node.title ~ l_node.title) )
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_un.content and then ll_node.summary ~ l_un.summary and then ll_node.title ~ l_un.title )
|
||||
end
|
||||
end
|
||||
|
||||
test_update_title
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
l_node: CMS_NODE
|
||||
u: CMS_USER
|
||||
do
|
||||
u := default_user
|
||||
storage.new_user (u)
|
||||
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
l_node := custom_node ("<h1> test node udpate </h1>", "Update node", "Test case update")
|
||||
storage.new_node (l_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_node.content and then ll_node.summary ~ l_node.summary and then ll_node.title ~ l_node.title )
|
||||
|
||||
-- Update node title
|
||||
|
||||
if attached {CMS_NODE} storage.node_by_id (1) as l_un then
|
||||
storage.update_node_title (u.id, l_un.id, "New Title")
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_un.content and then ll_node.summary ~ l_un.summary and then not ( ll_node.title ~ l_un.title) and then ll_node.title ~ "New Title" )
|
||||
end
|
||||
end
|
||||
|
||||
test_update_summary
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
l_node: CMS_NODE
|
||||
u: CMS_USER
|
||||
do
|
||||
u := default_user
|
||||
storage.new_user (u)
|
||||
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
l_node := custom_node ("<h1> test node udpate </h1>", "Update node", "Test case update")
|
||||
storage.new_node (l_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_node.content and then ll_node.summary ~ l_node.summary and then ll_node.title ~ l_node.title )
|
||||
|
||||
-- Update node summary
|
||||
|
||||
if attached {CMS_NODE} storage.node_by_id (1) as l_un then
|
||||
storage.update_node_summary (u.id, l_un.id, "New Summary")
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_un.content and then not (ll_node.summary ~ l_un.summary) and then ll_node.summary ~ "New Summary" and then ll_node.title ~ l_un.title)
|
||||
end
|
||||
end
|
||||
|
||||
test_update_content
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
l_node: CMS_NODE
|
||||
u: CMS_USER
|
||||
do
|
||||
u := default_user
|
||||
storage.new_user (u)
|
||||
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
l_node := custom_node ("<h1> test node udpate </h1>", "Update node", "Test case update")
|
||||
storage.sql_begin_transaction
|
||||
storage.new_node (l_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_node.content and then ll_node.summary ~ l_node.summary and then ll_node.title ~ l_node.title )
|
||||
|
||||
-- Update node content
|
||||
|
||||
if attached {CMS_NODE} storage.node_by_id (1) as l_un then
|
||||
storage.update_node_content (u.id, l_un.id, "New Content")
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then not (ll_node.content ~ l_un.content) and then ll_node.content ~ "New Content" and then ll_node.summary ~ l_un.summary and then ll_node.title ~ l_un.title)
|
||||
end
|
||||
storage.sql_commit_transaction
|
||||
end
|
||||
|
||||
|
||||
test_delete_node
|
||||
local
|
||||
l_node: CMS_NODE
|
||||
do
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
l_node := custom_node ("<h1> test node udpate </h1>", "Update node", "Test case update")
|
||||
storage.new_node (l_node)
|
||||
assert ("Not empty Nodes after new_node", not storage.nodes.after)
|
||||
-- Exist node with id 1
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1) as ll_node and then ll_node.content ~ l_node.content and then ll_node.summary ~ l_node.summary and then ll_node.title ~ l_node.title )
|
||||
|
||||
-- Delte node 1
|
||||
|
||||
storage.delete_node_by_id (1)
|
||||
assert ("Node does not exist", storage.node_by_id (1) = Void)
|
||||
end
|
||||
|
||||
test_recent_nodes
|
||||
-- Content_10, Summary_10, Title_10
|
||||
-- Content_9, Summary_9, Title_9
|
||||
-- ..
|
||||
-- Content_1, Summary_1, Title_1
|
||||
local
|
||||
i : INTEGER
|
||||
do
|
||||
assert ("Empty Nodes", storage.nodes.after)
|
||||
across 1 |..| 10 as c loop
|
||||
storage.new_node (custom_node ("Content_" + c.item.out, "Summary_" + c.item.out, "Title_" + c.item.out))
|
||||
end
|
||||
|
||||
-- Scenario (0,10) rows, recents (10 down to 1)
|
||||
i := 10
|
||||
across storage.recent_nodes (0, 10) as c loop
|
||||
assert ("Same id:" + i.out, c.item.id = i)
|
||||
i := i - 1
|
||||
end
|
||||
|
||||
-- Scenario (5, 10) rows, recent nodes (5 down to 1)
|
||||
i := 5
|
||||
across storage.recent_nodes (5, 10) as c loop
|
||||
assert ("Same id:" + i.out, c.item.id = i)
|
||||
i := i - 1
|
||||
end
|
||||
|
||||
-- Scenario (9,10) rows, recent node 1
|
||||
i := 1
|
||||
across storage.recent_nodes (9, 10) as c loop
|
||||
assert ("Same id:" + i.out, c.item.id = i)
|
||||
i := i - 1
|
||||
end
|
||||
|
||||
-- Scenrario 10..10 empty
|
||||
assert ("Empty", storage.recent_nodes (10, 10).after)
|
||||
end
|
||||
|
||||
test_new_node_add_author
|
||||
do
|
||||
storage.new_node (default_node)
|
||||
assert ("Exist node with id 1", attached {CMS_NODE} storage.node_by_id (1))
|
||||
storage.new_user (custom_user ("u1", "u1", "email"))
|
||||
if attached storage.user_by_name ("u1") as l_user then
|
||||
if attached storage.node_by_id (1) as l_node then
|
||||
l_node.set_author (l_user)
|
||||
storage.update_node (l_node)
|
||||
assert ("Author not void for node 1", attached storage.node_author (1))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,358 @@
|
||||
note
|
||||
description: "Summary description for {STORAGE_TEST_SET}."
|
||||
author: ""
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
|
||||
class
|
||||
STORAGE_TEST_SET
|
||||
|
||||
inherit
|
||||
EQA_TEST_SET
|
||||
redefine
|
||||
on_prepare,
|
||||
on_clean
|
||||
select
|
||||
default_create
|
||||
end
|
||||
ABSTRACT_DB_TEST
|
||||
rename
|
||||
default_create as default_db_test
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Events
|
||||
|
||||
on_prepare
|
||||
-- <Precursor>
|
||||
do
|
||||
(create {CLEAN_DB}).clean_db(connection)
|
||||
end
|
||||
|
||||
on_clean
|
||||
-- <Precursor>
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Test routines
|
||||
|
||||
test_has_user
|
||||
do
|
||||
assert ("Not has user", not storage.has_user)
|
||||
end
|
||||
|
||||
test_all_users
|
||||
do
|
||||
assert ("to implement all_users", False)
|
||||
end
|
||||
|
||||
test_user_by_id_not_exist
|
||||
do
|
||||
assert ("User does not exist", storage.user_by_id (1) = Void)
|
||||
end
|
||||
|
||||
test_user_by_name_not_exist
|
||||
do
|
||||
assert ("User does not exist", storage.user_by_name ("test") = Void)
|
||||
end
|
||||
|
||||
test_user_by_email_not_exist
|
||||
do
|
||||
assert ("User does not exist", storage.user_by_name ("test@test.com") = Void)
|
||||
end
|
||||
|
||||
test_user_with_bad_id
|
||||
local
|
||||
l_retry: BOOLEAN
|
||||
l_user: detachable CMS_USER
|
||||
do
|
||||
if not l_retry then
|
||||
l_user := storage.user_by_id (0)
|
||||
assert ("Precondition does not get the wrong value", False)
|
||||
else
|
||||
assert ("Expected precondition violation", True)
|
||||
end
|
||||
rescue
|
||||
l_retry := True
|
||||
retry
|
||||
end
|
||||
|
||||
test_user_with_bad_name_empty
|
||||
local
|
||||
l_retry: BOOLEAN
|
||||
l_user: detachable CMS_USER
|
||||
do
|
||||
if not l_retry then
|
||||
l_user := storage.user_by_name ("")
|
||||
assert ("Precondition does not get the wrong value", False)
|
||||
else
|
||||
assert ("Expected precondition violation", True)
|
||||
end
|
||||
rescue
|
||||
l_retry := True
|
||||
retry
|
||||
end
|
||||
|
||||
test_user_with_bad_email_empty
|
||||
local
|
||||
l_retry: BOOLEAN
|
||||
l_user: detachable CMS_USER
|
||||
do
|
||||
if not l_retry then
|
||||
l_user := storage.user_by_email ("")
|
||||
assert ("Precondition does not get the wrong value", False)
|
||||
else
|
||||
assert ("Expected precondition violation", True)
|
||||
end
|
||||
rescue
|
||||
l_retry := True
|
||||
retry
|
||||
end
|
||||
|
||||
test_new_user
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user", storage.has_user)
|
||||
end
|
||||
|
||||
test_user_by_id
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user", storage.has_user)
|
||||
if attached {CMS_USER} storage.user_by_id (1) as l_user then
|
||||
assert ("Exist", True)
|
||||
assert ("User test", l_user.name ~ "test")
|
||||
assert ("User id = 1", l_user.id = 1)
|
||||
else
|
||||
assert ("Wrong Implementation", False)
|
||||
end
|
||||
end
|
||||
|
||||
test_user_by_name
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user", storage.has_user)
|
||||
if attached {CMS_USER} storage.user_by_name ("test") as l_user then
|
||||
assert ("Exist", True)
|
||||
assert ("User nane: test", l_user.name ~ "test")
|
||||
else
|
||||
assert ("Wrong Implementation", False)
|
||||
end
|
||||
end
|
||||
|
||||
test_user_by_email
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user", storage.has_user)
|
||||
if attached {CMS_USER} storage.user_by_email ("test@test.com") as l_user then
|
||||
assert ("Exist", True)
|
||||
assert ("User email: test@test.com", l_user.email ~ "test@test.com")
|
||||
else
|
||||
assert ("Wrong Implementation", False)
|
||||
end
|
||||
end
|
||||
|
||||
test_invalid_credential
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user test", attached storage.user_by_name ("test"))
|
||||
assert ("Wrong password", not storage.is_valid_credential ("test", "test"))
|
||||
assert ("Wrong user", not storage.is_valid_credential ("test1", "test"))
|
||||
end
|
||||
|
||||
test_valid_credential
|
||||
do
|
||||
storage.new_user (default_user)
|
||||
assert ("Has user test", attached storage.user_by_name ("test"))
|
||||
assert ("Valid password", storage.is_valid_credential ("test", "password"))
|
||||
end
|
||||
|
||||
-- test_recent_nodes_empty
|
||||
-- do
|
||||
-- assert ("No recent nodes", storage.recent_nodes (0, 10).is_empty)
|
||||
-- end
|
||||
|
||||
-- test_recent_nodes
|
||||
-- local
|
||||
-- l_nodes: LIST[CMS_NODE]
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- storage.new_user (default_user)
|
||||
-- across 1 |..| 10 as c loop
|
||||
-- l_node := custom_node ("Content_" + c.item.out, "Summary_" + c.item.out, "Title_" + c.item.out)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- end
|
||||
-- l_nodes := storage.recent_nodes (0, 10)
|
||||
-- assert ("10 recent nodes", l_nodes.count = 10)
|
||||
-- assert ("First node id=10", l_nodes.first.id = 10)
|
||||
-- assert ("Last node id=1", l_nodes.last.id = 1)
|
||||
|
||||
|
||||
-- l_nodes := storage.recent_nodes (5, 10)
|
||||
-- assert ("5 recent nodes", l_nodes.count = 5)
|
||||
-- assert ("First node id=5", l_nodes.first.id = 5)
|
||||
-- assert ("Last node id=1", l_nodes.last.id = 1)
|
||||
|
||||
-- l_nodes := storage.recent_nodes (9, 10)
|
||||
-- assert ("1 recent nodes", l_nodes.count = 1)
|
||||
-- assert ("First node id=1", l_nodes.first.id = 1)
|
||||
-- assert ("Last node id=1", l_nodes.last.id = 1)
|
||||
|
||||
-- l_nodes := storage.recent_nodes (10, 10)
|
||||
-- assert ("Is empty", l_nodes.is_empty)
|
||||
-- end
|
||||
|
||||
-- test_node_does_not_exist
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- storage.new_user (default_user)
|
||||
-- across 1 |..| 10 as c loop
|
||||
-- l_node := custom_node ("Content_" + c.item.out, "Summary_" + c.item.out, "Title_" + c.item.out)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- end
|
||||
-- assert ("Not exist node id: 12", storage.node_by_id (12) = Void)
|
||||
-- end
|
||||
|
||||
-- test_node
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- storage.new_user (default_user)
|
||||
-- across 1 |..| 10 as c loop
|
||||
-- l_node := custom_node ("Content_" + c.item.out, "Summary_" + c.item.out, "Title_" + c.item.out)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- end
|
||||
-- assert ("Node id: 10", attached storage.node_by_id (10) as ll_node and then ll_node.title ~ "Title_10" )
|
||||
-- end
|
||||
|
||||
-- test_update_node
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- l_node := ll_node.twin
|
||||
-- l_node.set_content ("New Content")
|
||||
-- l_node.set_summary ("New Summary")
|
||||
-- l_node.set_title("New Title")
|
||||
-- if attached storage.user_by_email (default_user.email) as l_user then
|
||||
-- l_node.set_author (l_user)
|
||||
-- storage.update_node (l_node)
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then not (u_node.title ~ ll_node.title) and then not (u_node.content ~ ll_node.content) and then not (u_node.summary ~ ll_node.summary))
|
||||
-- end
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_update_node_title
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- storage.new_user (custom_user ("u2", "p2", "e2"))
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_title (2,ll_node.id, "New Title")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then not (u_node.title ~ ll_node.title) and then u_node.content ~ ll_node.content and then u_node.summary ~ ll_node.summary)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_update_node_summary
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- storage.new_user (custom_user ("u2", "p2", "e2"))
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_summary (2,ll_node.id, "New Summary")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then u_node.title ~ ll_node.title and then u_node.content ~ ll_node.content and then not (u_node.summary ~ ll_node.summary))
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_update_node_content
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- storage.new_user (custom_user ("u2", "p2", "e2"))
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_content (2,ll_node.id, "New Content")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then u_node.title ~ ll_node.title and then not (u_node.content ~ ll_node.content) and then u_node.summary ~ ll_node.summary)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
|
||||
-- test_update_node_title_by_author
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_title (1,ll_node.id, "New Title")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then not (u_node.title ~ ll_node.title) and then u_node.content ~ ll_node.content and then u_node.summary ~ ll_node.summary)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_update_node_summary_by_author
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_summary (1,ll_node.id, "New Summary")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then u_node.title ~ ll_node.title and then u_node.content ~ ll_node.content and then not (u_node.summary ~ ll_node.summary))
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_update_node_content_by_author
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- do
|
||||
-- l_node := custom_node ("Content", "Summary", "Title")
|
||||
-- storage.new_user (default_user)
|
||||
-- l_node.set_author (storage.user_by_email (default_user.email))
|
||||
-- storage.new_node (l_node)
|
||||
-- if attached {CMS_NODE} storage.node_by_id (1) as ll_node then
|
||||
-- storage.update_node_content (1,ll_node.id, "New Content")
|
||||
-- assert ("Updated", attached {CMS_NODE} storage.node_by_id (1) as u_node and then u_node.title ~ ll_node.title and then not (u_node.content ~ ll_node.content) and then u_node.summary ~ ll_node.summary)
|
||||
-- end
|
||||
-- end
|
||||
|
||||
-- test_delete_node
|
||||
-- local
|
||||
-- l_node: CMS_NODE
|
||||
-- l_user: like {CMS_NODE}.author
|
||||
-- do
|
||||
-- storage.new_user (custom_user ("test_delete", "testu", "email"))
|
||||
-- l_user := storage.user_by_name ("test_delete")
|
||||
-- across 1 |..| 10 as c loop
|
||||
-- l_node := custom_node ("Content_" + c.item.out, "Summary_" + c.item.out, "Title_" + c.item.out)
|
||||
-- l_node.set_author (l_user)
|
||||
-- storage.new_node (l_node)
|
||||
-- end
|
||||
-- assert ("Exist node id: 10", attached storage.node_by_id (10) as ll_node and then ll_node.title ~ "Title_10" )
|
||||
-- storage.delete_node_by_id (10)
|
||||
-- assert ("Not exist node id: 10", storage.node_by_id (10) = Void)
|
||||
-- end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-13-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-13-0 http://www.eiffel.com/developers/xml/configuration-1-13-0.xsd" name="tests" uuid="FCC2264E-784F-4ACF-9262-E348904FDBA5">
|
||||
<target name="tests">
|
||||
<root class="APPLICATION" feature="make"/>
|
||||
<option warning="true" void_safety="conformance">
|
||||
<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
|
||||
</option>
|
||||
<setting name="concurrency" value="thread"/>
|
||||
<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
|
||||
<library name="cms" location="..\..\..\..\cms-safe.ecf" readonly="false"/>
|
||||
<library name="crypto" location="$ISE_LIBRARY\unstable\library\text\encryption\crypto\crypto-safe.ecf"/>
|
||||
<library name="model" location="..\..\..\model\cms_model-safe.ecf"/>
|
||||
<library name="module_node" location="..\..\..\..\modules\node\node-safe.ecf"/>
|
||||
<library name="persitence_mysql" location="..\persistence_mysql-safe.ecf" readonly="false"/>
|
||||
<library name="process" location="$ISE_LIBRARY\library\process\process-safe.ecf"/>
|
||||
<library name="testing" location="$ISE_LIBRARY\library\testing\testing-safe.ecf"/>
|
||||
<cluster name="tests" location=".\" recursive="true">
|
||||
<file_rule>
|
||||
<exclude>/EIFGENs$</exclude>
|
||||
<exclude>/CVS$</exclude>
|
||||
<exclude>/.svn$</exclude>
|
||||
<exclude>/nodes$</exclude>
|
||||
</file_rule>
|
||||
</cluster>
|
||||
</target>
|
||||
</system>
|
||||
@@ -0,0 +1,87 @@
|
||||
note
|
||||
description: "[
|
||||
Eiffel tests that can be executed by testing tool.
|
||||
]"
|
||||
author: "EiffelStudio test wizard"
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
testing: "type/manual"
|
||||
|
||||
class
|
||||
TRANSACTION_TEST_SET
|
||||
|
||||
inherit
|
||||
|
||||
EQA_TEST_SET
|
||||
redefine
|
||||
on_prepare,
|
||||
on_clean
|
||||
select
|
||||
default_create
|
||||
end
|
||||
ABSTRACT_DB_TEST
|
||||
rename
|
||||
default_create as default_db_test
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Events
|
||||
|
||||
on_prepare
|
||||
-- <Precursor>
|
||||
do
|
||||
(create {CLEAN_DB}).clean_db (connection)
|
||||
end
|
||||
|
||||
on_clean
|
||||
-- <Precursor>
|
||||
do
|
||||
end
|
||||
|
||||
feature -- Test routines
|
||||
|
||||
test_user_rollback
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
u := storage.user_by_name ("test")
|
||||
if u = Void then
|
||||
u := custom_user ("test", "test","test@admin.com")
|
||||
storage.new_user (u)
|
||||
end
|
||||
assert ("Has user:", storage.has_user)
|
||||
u.set_email ("test@example.com")
|
||||
storage.sql_begin_transaction
|
||||
storage.update_user (u)
|
||||
assert ("Has user:", storage.user_by_email ("test@example.com") /= Void)
|
||||
storage.sql_rollback_transaction
|
||||
assert ("Not has user:", storage.user_by_email ("test@example.com") = Void)
|
||||
end
|
||||
|
||||
test_user_node_rollback
|
||||
note
|
||||
testing: "execution/isolated"
|
||||
local
|
||||
u: detachable CMS_USER
|
||||
do
|
||||
u := storage.user_by_name ("test")
|
||||
if u = Void then
|
||||
u := custom_user ("test", "test","test@admin.com")
|
||||
storage.new_user (u)
|
||||
end
|
||||
|
||||
connection.begin_transaction
|
||||
u.set_email ("test@example.com")
|
||||
assert ("Has user:", storage.user_by_email ("test@example.com") /= Void)
|
||||
-- storage.new_node (default_node)
|
||||
-- assert ("Has one node:", storage.nodes_count = 1)
|
||||
connection.rollback
|
||||
assert ("Not has user:", storage.user_by_email ("test@example.com") = Void)
|
||||
-- assert ("Has no node:", storage.nodes_count = 0)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
note
|
||||
description: "[
|
||||
Eiffel tests that can be executed by testing tool.
|
||||
]"
|
||||
author: "EiffelStudio test wizard"
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
testing:"execution/isolated"
|
||||
|
||||
class
|
||||
USER_TEST_SET
|
||||
|
||||
inherit
|
||||
EQA_TEST_SET
|
||||
redefine
|
||||
on_prepare,
|
||||
on_clean
|
||||
select
|
||||
default_create
|
||||
end
|
||||
ABSTRACT_DB_TEST
|
||||
rename
|
||||
default_create as default_db_test
|
||||
end
|
||||
|
||||
|
||||
feature {NONE} -- Events
|
||||
|
||||
on_prepare
|
||||
-- <Precursor>
|
||||
do
|
||||
(create {CLEAN_DB}).clean_db(connection)
|
||||
storage.new_user (custom_user ("admin", "admin","admin@admin.com"))
|
||||
end
|
||||
|
||||
on_clean
|
||||
-- <Precursor>
|
||||
do
|
||||
-- (create {CLEAN_DB}).clean_db(connection)
|
||||
end
|
||||
|
||||
feature -- Test routines
|
||||
|
||||
test_user_exist
|
||||
-- User admin exist
|
||||
do
|
||||
assert ("Not void", attached storage.user_by_email ("admin@admin.com"))
|
||||
assert ("Not void", attached storage.user_by_id (1))
|
||||
assert ("Not void", attached storage.user_by_name ("admin"))
|
||||
end
|
||||
|
||||
test_user_not_exist
|
||||
-- Uset test does not exist.
|
||||
do
|
||||
assert ("User by email: Void", storage.user_by_email ("test1@test.com") = Void)
|
||||
assert ("User by id: Void", storage.user_by_id (5) = Void )
|
||||
assert ("User by name: Void", storage.user_by_name ("test1") = Void)
|
||||
end
|
||||
|
||||
test_new_user
|
||||
local
|
||||
u: CMS_USER
|
||||
do
|
||||
u := default_user
|
||||
storage.new_user (u)
|
||||
assert ("Not void", attached storage.user_by_email (u.email))
|
||||
assert ("Not void", attached storage.user_by_id (2))
|
||||
assert ("Not void", attached storage.user_by_id (2) as l_user and then l_user.id = 2 and then l_user.name ~ u.name)
|
||||
assert ("Not void", attached storage.user_by_name (u.name))
|
||||
end
|
||||
|
||||
-- test_new_user_with_roles
|
||||
-- do
|
||||
-- storage.new_user (default_user)
|
||||
-- storage.new_role ("Admin")
|
||||
-- assert ("Empty roles for given user", storage.user_roles (1).after)
|
||||
-- storage.add_role (1, 1)
|
||||
-- assert ("Not empty roles for given user", not storage.user_roles (1).after)
|
||||
-- end
|
||||
|
||||
-- test_new_user_without_profile
|
||||
-- do
|
||||
-- storage.new_user ("test", "test","test@admin.com")
|
||||
-- assert ("Empty", storage.user_profile (1).new_cursor.after)
|
||||
-- end
|
||||
|
||||
-- test_new_user_with_profile
|
||||
-- local
|
||||
-- l_profile: CMS_USER_PROFILE
|
||||
-- l_db_profile: CMS_USER_PROFILE
|
||||
-- do
|
||||
-- storage.new_user (default_user)
|
||||
-- if attached {CMS_USER} storage.user_by_name ("test") as l_user then
|
||||
-- assert ("Empty", storage.user_profile (l_user.id).new_cursor.after)
|
||||
-- create l_profile.make
|
||||
-- l_profile.force ("Eiffel", "language")
|
||||
-- l_profile.force ("Argentina", "country")
|
||||
-- l_profile.force ("GMT-3", "time zone")
|
||||
-- storage.save_profile (l_user.id, l_profile)
|
||||
-- l_db_profile := storage.user_profile (l_user.id)
|
||||
-- assert ("Not Empty", not l_db_profile.new_cursor.after)
|
||||
|
||||
-- assert ("Expected language Eiffel", attached l_db_profile.item ("language") as l_language and then l_language ~ "Eiffel")
|
||||
-- assert ("Expected time zone GMT-3", attached l_db_profile.item ("time zone") as l_language and then l_language ~ "GMT-3")
|
||||
-- end
|
||||
-- end
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
note
|
||||
description: "Summary description for {ABSTRACT_DB_TEST}."
|
||||
date: "$Date: 2015-01-27 19:15:02 +0100 (mar., 27 janv. 2015) $"
|
||||
revision: "$Revision: 96542 $"
|
||||
|
||||
class
|
||||
ABSTRACT_DB_TEST
|
||||
|
||||
|
||||
feature -- Database connection
|
||||
|
||||
connection: DATABASE_CONNECTION_MYSQL
|
||||
-- MYSQL database connection
|
||||
once
|
||||
create Result.login_with_schema ("cms_dev", "root", "")
|
||||
end
|
||||
|
||||
storage: CMS_STORAGE_MYSQL
|
||||
once
|
||||
create Result.make (connection)
|
||||
end
|
||||
|
||||
feature {NONE} -- Fixture Factory: Users
|
||||
|
||||
default_user: CMS_USER
|
||||
do
|
||||
Result := custom_user ("test", "password", "test@test.com")
|
||||
end
|
||||
|
||||
custom_user (a_name, a_password: READABLE_STRING_32; a_email: READABLE_STRING_8): CMS_USER
|
||||
do
|
||||
create Result.make (a_name)
|
||||
Result.set_password (a_password)
|
||||
Result.set_email (a_email)
|
||||
end
|
||||
|
||||
feature {NONE} -- Fixture Factories: Nodes
|
||||
|
||||
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_PAGE
|
||||
do
|
||||
create Result.make (a_title)
|
||||
Result.set_content (a_content, a_summary, Void)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,129 @@
|
||||
note
|
||||
description: "[
|
||||
Setting up database tests
|
||||
1. Put the database in a known state before running your test suite.
|
||||
2. Data reinitialization. For testing in developer sandboxes, something that you should do every time you rebuild the system, you may want to forgo dropping and rebuilding the database in favor of simply reinitializing the source data.
|
||||
You can do this either by erasing all existing data and then inserting the initial data vales back into the database, or you can simple run updates to reset the data values.
|
||||
The first approach is less risky and may even be faster for large amounts of data. - See more at: http://www.agiledata.org/essays/databaseTesting.html#sthash.6yVp35g8.dpuf
|
||||
]"
|
||||
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
EIS: "name=Database Testing", "src=http://www.agiledata.org/essays/databaseTesting.html", "protocol=uri"
|
||||
testing:"execution/serial"
|
||||
|
||||
class
|
||||
CLEAN_DB
|
||||
|
||||
feature
|
||||
|
||||
clean_db (a_connection: DATABASE_CONNECTION)
|
||||
-- Clean db test.
|
||||
local
|
||||
l_parameters: STRING_TABLE[STRING]
|
||||
do
|
||||
create l_parameters.make (0)
|
||||
|
||||
a_connection.begin_transaction
|
||||
|
||||
-- Clean Profiles
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_user_profiles, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
-- Clean Permissions
|
||||
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
|
||||
|
||||
-- Clean Roles
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_roles, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
-- Clean Nodes
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_nodes, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
-- Clean Users
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Sql_delete_users, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
|
||||
-- Reset Autoincremente
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_users_autoincrement, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_nodes_autoincrement, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_roles_autoincrement, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_permissions_autoincrement, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
db_handler(a_connection).set_query (create {DATABASE_QUERY}.data_reader (Rest_profiles_autoincrement, l_parameters))
|
||||
db_handler(a_connection).execute_change
|
||||
|
||||
a_connection.commit
|
||||
end
|
||||
|
||||
|
||||
|
||||
feature -- Database Hanlder
|
||||
|
||||
db_handler (a_connection: DATABASE_CONNECTION): DATABASE_HANDLER
|
||||
-- Db handler
|
||||
once
|
||||
create {DATABASE_HANDLER_IMPL} Result.make (a_connection)
|
||||
end
|
||||
|
||||
|
||||
feature -- Sql delete queries
|
||||
|
||||
Sql_delete_users: STRING = "delete from Users"
|
||||
-- Clean Users.
|
||||
|
||||
Sql_delete_nodes: STRING = "delete from Nodes"
|
||||
-- Clean Nodes.
|
||||
|
||||
Sql_delete_roles: STRING = "delete from Roles"
|
||||
-- Clean Roles.
|
||||
|
||||
Sql_delete_permissions: STRING = "delete from Permissions"
|
||||
-- Clean Permissions.
|
||||
|
||||
Sql_delete_users_roles: STRING = "delete from Users_roles"
|
||||
-- Clean User roles.
|
||||
|
||||
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
|
||||
|
||||
Rest_nodes_autoincrement: STRING = "ALTER TABLE Nodes AUTO_INCREMENT = 1"
|
||||
-- reset autoincrement.
|
||||
|
||||
Rest_roles_autoincrement: STRING = "ALTER TABLE Roles AUTO_INCREMENT = 1"
|
||||
-- reset autoincrement.
|
||||
|
||||
Rest_permissions_autoincrement: STRING = "ALTER TABLE Permissions AUTO_INCREMENT = 1"
|
||||
-- reset autoincrement.
|
||||
|
||||
Rest_profiles_autoincrement: STRING = "ALTER TABLE Profiles AUTO_INCREMENT = 1"
|
||||
-- reset autoincrement.
|
||||
|
||||
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user