1
0

DoesTesting.pm 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package Test::Selenium::Remote::Role::DoesTesting;
  2. # ABSTRACT: Role to cope with everything that is related to testing (could
  3. # be reused in both testing classes)
  4. use Moo::Role;
  5. use Test::Builder;
  6. use Try::Tiny;
  7. use Scalar::Util 'blessed';
  8. use List::MoreUtils qw/any/;
  9. use namespace::clean;
  10. requires qw(func_list has_args);
  11. has _builder => (
  12. is => 'lazy',
  13. builder => sub { return Test::Builder->new() },
  14. handles => [qw/is_eq isnt_eq like unlike ok croak/],
  15. );
  16. # get back the key value from an already coerced finder (default finder)
  17. sub _get_finder_key {
  18. my $self = shift;
  19. my $finder_value = shift;
  20. foreach my $k (keys %{$self->FINDERS}) {
  21. return $k if ($self->FINDERS->{$k} eq $finder_value);
  22. }
  23. return;
  24. }
  25. # main method for non ok tests
  26. sub _check_method {
  27. my $self = shift;
  28. my $method = shift;
  29. my $method_to_test = shift;
  30. $method = "get_$method";
  31. my @args = @_;
  32. my $rv;
  33. try {
  34. my $num_of_args = $self->has_args($method);
  35. my @r_args = splice( @args, 0, $num_of_args );
  36. $rv = $self->$method(@r_args);
  37. }
  38. catch {
  39. $self->croak($_);
  40. };
  41. return $self->$method_to_test( $rv, @args );
  42. }
  43. # main method for _ok tests
  44. # a bit hacked so that find_no_element_ok can also be processed
  45. sub _check_ok {
  46. my $self = shift;
  47. my $method = shift;
  48. my $real_method = '';
  49. my @args = @_;
  50. my ($rv, $num_of_args, @r_args);
  51. try {
  52. $num_of_args = $self->has_args($method);
  53. @r_args = splice( @args, 0, $num_of_args );
  54. if ($method =~ m/^find(_no|_child)?_element/) {
  55. # case find_element_ok was called with no arguments
  56. if (scalar(@r_args) - $num_of_args == 1) {
  57. push @r_args, $self->_get_finder_key($self->default_finder);
  58. }
  59. else {
  60. if (scalar(@r_args) == $num_of_args) {
  61. # case find_element was called with no finder but
  62. # a test description
  63. my $finder = $r_args[$num_of_args - 1];
  64. my @FINDERS = keys (%{$self->FINDERS});
  65. unless ( any { $finder eq $_ } @FINDERS) {
  66. $r_args[$num_of_args - 1] = $self->_get_finder_key($self->default_finder);
  67. push @args, $finder;
  68. }
  69. }
  70. }
  71. }
  72. # quick hack to fit 'find_no_element' into check_ok logic
  73. if ($method eq 'find_no_element') {
  74. $real_method = $method;
  75. $method = 'find_element';
  76. }
  77. $rv = $self->$method(@r_args);
  78. }
  79. catch {
  80. if ($real_method) {
  81. $method = $real_method;
  82. $rv = 1;
  83. }
  84. else {
  85. $self->croak($_);
  86. }
  87. };
  88. my $default_test_name = $method;
  89. $default_test_name .= "'" . join("' ", @r_args) . "'"
  90. if $num_of_args > 0;
  91. my $test_name = pop @args // $default_test_name;
  92. # case when find_no_element found an element, we should croak
  93. if ($real_method eq 'find_no_element') {
  94. if (blessed($rv) && $rv->isa('Selenium::Remote::WebElement')) {
  95. $self->croak($test_name);
  96. }
  97. }
  98. return $self->ok( $rv, $test_name);
  99. }
  100. # build the subs with the correct arg set
  101. sub _build_sub {
  102. my $self = shift;
  103. my $meth_name = shift;
  104. my @func_args;
  105. my $comparators = {
  106. is => 'is_eq',
  107. isnt => 'isnt_eq',
  108. like => 'like',
  109. unlike => 'unlike',
  110. };
  111. my @meth_elements = split( '_', $meth_name );
  112. my $meth = '_check_ok';
  113. my $meth_comp = pop @meth_elements;
  114. if ( $meth_comp eq 'ok' ) {
  115. push @func_args, join( '_', @meth_elements );
  116. }
  117. else {
  118. if ( defined( $comparators->{$meth_comp} ) ) {
  119. $meth = '_check_method';
  120. push @func_args, join( '_', @meth_elements ),
  121. $comparators->{$meth_comp};
  122. }
  123. else {
  124. return sub {
  125. my $self = shift;
  126. $self->croak("Sub $meth_name could not be defined");
  127. }
  128. }
  129. }
  130. return sub {
  131. my $self = shift;
  132. local $Test::Builder::Level = $Test::Builder::Level + 2;
  133. $self->$meth( @func_args, @_ );
  134. };
  135. }
  136. 1;
  137. =head1 NAME
  138. Selenium::Remote::Role::DoesTesting - Role implementing the common logic used for testing
  139. =cut