diff --git a/src/warden-server/lib/Warden.t b/src/warden-server/lib/Warden.t
index 956f3f69b8afa06ce35dc1bfb8769e5ad42bbe1c..7f0ecc3ec03f5943b0be6148454b9ee2fcab3692 100644
--- a/src/warden-server/lib/Warden.t
+++ b/src/warden-server/lib/Warden.t
@@ -5,76 +5,140 @@ use warnings;
 
 use DBI;
 use DBD::mysql;
+use Data::Dumper;
 
-use Test::More tests => 2;
-#use Test::Exception;
+use Test::More tests => 18;
+use Test::MockModule;
+use Test::Exception;
 
 use lib '..';
 use Warden;
 
 # Fake $ENV values
 BEGIN {
-  $ENV{'SSL_CLIENT_S_DN_CN'} = '?';
-  $ENV{'SSL_CLIENT_CERT'}    = '?';
-  $ENV{'REMOTE_ADDR'}        = '?';
+  $ENV{'SSL_CLIENT_S_DN_CN'} = 'warden-dev.cesnet.cz';
+  $ENV{'SSL_CLIENT_CERT'}    = '-----BEGIN CERTIFICATE-----
+MIIEZzCCA0+gAwIBAgIRAKV1flST9dLTKDnQZsgWFmQwDQYJKoZIhvcNAQEFBQAw
+NjELMAkGA1UEBhMCTkwxDzANBgNVBAoTBlRFUkVOQTEWMBQGA1UEAxMNVEVSRU5B
+IFNTTCBDQTAeFw0xMTA4MTgwMDAwMDBaFw0xMzA4MTcyMzU5NTlaMD0xCzAJBgNV
+BAYTAkNaMQ8wDQYDVQQKEwZDRVNORVQxHTAbBgNVBAMTFHdhcmRlbi1kZXYuY2Vz
+bmV0LmN6MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxIzyexCL/CB6
+COj691JLEWYEVkBLhROqbENk0ka/LbTtS5oNS3WDJVOK7aoHO3yluAdg1VocfFeY
+hTgZGAzC82IuNLc+873XTfO2bzotbJL31CBUwpz2QhEAjGgjdvSx++VZAlbDKIa7
+RnRcp9AsxPgqlUokVZbmR55sRO7QPaFqBUO061rj56uKzZocXy9RB+vVBQFUR5CF
+GKOJhsiRU3GtHpEshKpOGX6jiC5OkUkcVr61Fb4BgKPFFptiiuwTuHUM40PLAdC/
+B2lWdt4qPZqeiDFOVAQJH2tpi0Bhn2dmS1ttU76qpfP4RCPXZFxdxqxWgMjGq7Fp
+ON3G3ySb3QIDAQABo4IBZzCCAWMwHwYDVR0jBBgwFoAUDL2TaAzz3qujSWsrN1dH
+6pDjue0wHQYDVR0OBBYEFMfGqZzdRFP42/ewN/5kPQoI83hxMA4GA1UdDwEB/wQE
+AwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
+AjAYBgNVHSAEETAPMA0GCysGAQQBsjEBAgIdMDoGA1UdHwQzMDEwL6AtoCuGKWh0
+dHA6Ly9jcmwudGNzLnRlcmVuYS5vcmcvVEVSRU5BU1NMQ0EuY3JsMG0GCCsGAQUF
+BwEBBGEwXzA1BggrBgEFBQcwAoYpaHR0cDovL2NydC50Y3MudGVyZW5hLm9yZy9U
+RVJFTkFTU0xDQS5jcnQwJgYIKwYBBQUHMAGGGmh0dHA6Ly9vY3NwLnRjcy50ZXJl
+bmEub3JnMB8GA1UdEQQYMBaCFHdhcmRlbi1kZXYuY2VzbmV0LmN6MA0GCSqGSIb3
+DQEBBQUAA4IBAQC/mZ2bKGj4ysHVB4q/skhYXMiTYBmVD7G7X434YIg70VDBM5IJ
+efNNfx8HNdCprboX5PSPCpxl9n3TPARnEO2cm7XvVvt+wkdjNOys8z7a2DIPaeJ+
+An3sIPzWUtm85UxujghIJ9nPh1ovZ75cQ2HF5C79qCyKzHtfP77Kq61Nm2Ay4aTq
+gWyjFAPRjnB9fczhjdzntVRdjUFVq8z4ifq3Lv+hbN6aOjhfKRt8Ksr3IFlfKJdy
+0sE0lEZdjG+O8rsuHCT/c+90IvGsG5JLT5SPJIxwQ1+fPJDfB37VWmUC9meSe7rt
+iP0EQsnY1ytKuyUylJl0FiF/wG3rB8N7qlua
+-----END CERTIFICATE-----';
+  $ENV{'REMOTE_ADDR'}        = '195.113.161.39';
   $ENV{'SERVER_NAME'}        = 'warden-dev.cesnet.cz';
   $ENV{'SERVER_ADDR'}        = '195.113.161.39';
   $ENV{'SERVER_PORT'}        = '443';
-}
-
 
-my $ret;
+  $Warden::MAX_EVENTS_LIMIT = "1000001";
+  %Warden::VALID_STRINGS = (
+        'type'          => ['portscan', 'bruteforce', 'probe', 'spam', 'phishing', 'botnet_c_c', 'dos', 'malware', 'copyright', 'webattack', 'test', 'other'],
+        'source_type'   => ['IP', 'URL', 'Reply-To:']);
 
+  my $correctDBH = DBI->connect("DBI:mysql:database=warden;host=localhost", "root", "w4rd3n&r00t", {RaiseError => 1, mysql_auto_reconnect => 1}) || die "Could not connect to database: $DBI::errstr";
 
-our $MAX_EVENTS_LIMIT = "1000000";
-our %VALID_STRINGS = (
-"type" => ["portscan", "bruteforce", "probe", "spam", "phishing", "botnet_c_c", "dos", "malware", "copyright", "webattack", "test", "other"],
-);
+  my $failDBH;
 
-our $DBH = DBI->connect("DBI:mysql:database=warden;host=localhost", "root", "w4rd3n&r00t", {RaiseError => 1, mysql_auto_reconnect => 1}) || die "Could not connect to database: $DBI::errstr";
-
-#print $ENV{'SSL_CLIENT_S_DN_CN'};
-#foreach (keys %ENV){
-#  print "$_ -> $ENV{$_}\n";
-#}
+  $Warden::DBH = $correctDBH;
+}
 
-#trim test
-$ret = Warden::trim('   a  ');
-is($ret,'a','Trim si OK.');
 
+my $ret;
 
 # Alternate names test
+print "GetAltNames test\n"; 
+
+# 1
 #$alt_names, $ip, $service_type, $client_type, $function_name
-#$ret = Warden::getAltNames("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent");
-#is($ret, '', 'Alternate names are OK.');
+lives_and( sub{ is Warden::getAltNames("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent"), "'warden-dev.cesnet.cz','warden-dev.cesnet.cz'"}, 'everything is OK.');
+#print "$@\n";
 
 # Client authorizaton test
-#$ret = Warden::authorizeClient("warden-dev.cesnet.cz","195.113.161.39","honeyscan","s","someEvent");
-#is($ret, undef, 'Client is unregistered.');
+print "AuthorizeClient tests\n";
+
+# 2
+dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","honeyscan","s","badAndUglyEvent") }, 'badAndUglyEvent: die (doesn\'t exist)' );
+#print "$@\n";
+
+# 3
+dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.222","badType","s","saveNewEvent")}, 'saveNewEvent: client is not registered');
+#print "$@\n";
+
+# 4
+dies_ok( sub{ Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.222","badType","s","getNewEvents")}, 'getNewEvents: client is not registered');
+#print "$@\n";
 
-#$ret = Warden::authorizeClient();
-#is($ret, undef, 'Client is from the unauthorized subnet.');
+# 5
+lives_and( sub{ is Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","honeyscan","s","saveNewEvent"), '3/8'}, 'saveNewEvent: OK.');
+#print "$@\n";
 
-#$ret = Warden::authorizeClient();
-#is($ret, undef, 'Everything is fine.');
+# 6
+lives_and( sub{ is Warden::authorizeClient("'warden-dev.cesnet.cz','warden-dev.cesnet.cz'","195.113.161.39","any","r","getNewEvents"), '3/8'}, 'getNewEvents: OK.');
+#print "$@\n";
 
 # Save event test
-#$class, $data
-#dies_ok {Warden::saveNewEvent()} 'Cannot do insert statement.';
+print "SaveNewEvent tests\n";
+# TODO: run database and SELECT error checks
+my %event = ('TYPE' => 'badType', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad type');
 
-#my @event_ok = ("honeyscan", "1234567890", "portscan","IP", "123.123.123.123", "TCP", "22", "1234567890", "important note or comment", "null", "20");
-#$ret = Warden::saveNewEvent("a",@event_ok);
-#ok($ret, 'Everything is fine.');
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'BADTYPE', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad source type.');
 
-# Get new event
-#dies_ok {Warden::getNewEvents()} 'Cannot work with the database.';
+%event = ('TYPE' => 'test', 'DETECTED' => 'XXXX-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'bad date format.');
+
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => 'XXX', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'port is not a number.');
+
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => 'XXX', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'attack scale is not a number.');
+
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => 'XXX', 'TIMEOUT' => '20');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'priority is not a number.');
+
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => 'XXX');
+dies_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'timeout is not a number.');
 
-#$ret = Warden::getNewEvents();
-#is($ret, @EVENTS, 'Everything is fine.');
+%event = ('TYPE' => 'test', 'DETECTED' => '2012-09-18T06:06:06+01:00', 'SERVICE' => 'test', 'SOURCE_TYPE' => 'IP', 'SOURCE' => '123.123.123.123', 'TARGET_PROTO' => 'TCP', 'TARGET_PORT' => '22', 'ATTACK_SCALE' => '1234567890', 'NOTE' => 'Unit testing event', 'PRIORITY' => '1', 'TIMEOUT' => '20');
+lives_ok( sub{ $ret = Warden::saveNewEvent("test", \%event)}, 'everything is fine.');
+
+# Get new event
+print "GetNewEvents tests\n";
+# TODO: run database and SELECT error checks
+# dies_ok {Warden::getNewEvents()} 'Cannot work with the database.';
+my %getEventHash = ('REQUESTED_TYPE' => 'any', 'LAST_ID' => '1', 'MAX_RCV_EVENTS_LIMIT' => '10');
+lives_ok( sub{ Warden::getNewEvents("test",\%getEventHash)}, 'everything is fine.');
 
 # Get last ID test
-#dies_ok {Warden::getLastId()} 'Cannot prepare statment.';
+print "GetLastId test\n";
+# TODO: run database and SELECT error checks
+lives_ok( sub{Warden::getLastId() =~ /^\d+$/}, 'getLastID is OK.');
+
+# Get clients test
+print "GetClients\n";
+# TODO: run database and SELECT error checks
+lives_ok( sub{ Warden::getClients()}, 'everything is fine.');
+
+print "GetStatus\n";
+# run database and SELECT error checks
+lives_ok( sub{ Warden::getStatus()}, 'everything is fine.');
 
-$ret = Warden::getLastId();
-print $ret. "\n";
-is($ret, '16302246', 'GetLastID is OK.');