e54327bf8b3a75e8a7102c430791895dbab3bddf
[kivitendo-erp.git] / t / x / exceptions.t
1 use Test::More tests => 25;
2
3 use lib 't';
4
5 use SL::X;
6
7 # check exception serialization
8
9 my @classes = qw(
10   SL::X::DBError
11   SL::X::Inventory::Allocation
12   SL::X::ZUGFeRDValidation
13 );
14
15 # check basic mesage / error serialization
16
17 for my $error_class (@classes) {
18
19   my $x = $error_class->new(message => "test message");
20
21   is $x->error,   "test message", "$error_class(message): error works";
22   is $x->message, "test message", "$error_class(message): message works";
23   is "$x",        "test message", "$error_class(message): stringify works";
24
25   $x = $error_class->new(error => "test message");
26
27   is $x->error,   "test message", "$error_class(error): error works";
28   is $x->message, "test message", "$error_class(error): message works";
29   is "$x",        "test message", "$error_class(error): stringify works";
30 }
31
32
33 # now create some classes with message templates and extra fields
34
35 my $x = SL::X::DBError->new(msg => "stuff", db_error => "broke");
36
37 is $x->error,   "stuff: broke", "template: error works";
38 is $x->message, "stuff: broke", "tempalte: message works";
39 is "$x",        "stuff: broke", "template: stringify works";
40
41
42 $x = SL::X::Inventory::Allocation->new(code => "DEADCOFFEE", message => "something went wrong");
43
44 is $x->code,   "DEADCOFFEE", "extra fields work";
45
46
47
48 # check stack traces
49
50 sub a { b() }
51 sub b { c() }
52 sub c { d() }
53 sub d { e() }
54 sub e { f() }
55 sub f { SL::X::DBError->throw() }
56
57 eval {
58   a();
59 } or do {
60   if (my $e = SL::X::DBError->caught) {
61     ok 1, "caught db error";
62     ok $e->trace->as_string =~ /main::a/, "trace contains function a";
63     ok $e->trace->as_string =~ /main::f/, "trace contains function f";
64
65   } else {
66     ok 0, "didn't catch db error";
67   }
68 };