Bug 17654: Add tests to enforce swagger definition files integrity

The swagger definition error we found on bug 17651 should have been
caught earlier with tests.

Now we are testing for nullable columns.

QA: Have a look at the FIXME

Test plan:
Apply without 17651 (revert if already pushed)
The tests won't pass
On top of 17651 the tests will pass

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Katrin Fischer  <katrin.fischer@bsz-bw.de>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
Jonathan Druart 2016-11-17 16:08:00 +00:00 committed by Kyle M Hall
parent 4366a0b469
commit f67adfcb11
1 changed files with 48 additions and 11 deletions

View File

@ -26,10 +26,12 @@ use Module::Load::Conditional;
use Swagger2;
use C4::Context;
use Koha::Database;
my $swaggerPath = C4::Context->config('intranetdir') . "/api/v1/swagger";
my $swagger = Swagger2->new( $swaggerPath . "/swagger.json" )->expand;
my $api_spec = $swagger->api_spec->data;
my $schema = Koha::Database->new->schema;
# The basic idea of this test:
# 1. Find all definitions in Swagger under api/v1/definitions
@ -44,7 +46,7 @@ my $api_spec = $swagger->api_spec->data;
my @definition_names = keys %{ $api_spec->{definitions} };
subtest 'api/v1/definitions/*.json up-to-date with corresponding Koha-object' => sub {
plan tests => scalar(@definition_names);
plan tests => 2*(scalar(@definition_names) - 1);
foreach my $name (@definition_names) {
my $definition = $api_spec->{definitions}->{$name};
@ -57,10 +59,20 @@ subtest 'api/v1/definitions/*.json up-to-date with corresponding Koha-object' =>
next;
}
my $columns = $kohaObject->_columns;
my $columns_info = $schema->resultset( $kohaObject->_type )->result_source->columns_info;
my $properties = $definition->{properties};
is(_is_up_to_date($properties, $columns), "",
"$name matches ".ref($kohaObject)." and is not missing any properties.");
my @missing = check_columns_exist($properties, $columns_info);
if ( @missing ) {
fail( "Columns are missing for $name: " . join(", ", @missing ) );
} else {
pass( "No columns are missing for $name" );
}
my @nullable= check_is_nullable($properties, $columns_info);
if ( @nullable ) {
fail( "Columns is nullable in DB, not in swagger file for $name: " . join(", ", @nullable ) );
} else {
pass( "No null are missing for $name" );
}
} else {
ok(1, "$name type is not an object. It is ".$definition->{type}.".");
}
@ -77,12 +89,37 @@ sub _koha_object {
}
}
sub _is_up_to_date {
my ($properties, $columns) = @_;
my @missing;
foreach my $column (@$columns) {
push @missing, $column unless $properties->{$column};
sub check_columns_exist {
my ($properties, $columns_info) = @_;
my @missing_column;
for my $column_name ( keys %$columns_info ) {
my $c_info = $columns_info->{$column_name};
unless ( exists $properties->{$column_name} ) {
push @missing_column, $column_name;
next;
}
}
return join(', ' , @missing);
return @missing_column;
}
sub check_is_nullable {
my ($properties, $columns_info) = @_;
my @missing_nullable;
for my $column_name ( keys %$columns_info ) {
my $c_info = $columns_info->{$column_name};
if ( $c_info->{is_nullable} or $c_info->{datetime_undef_if_invalid} ) {
my $type = $properties->{$column_name}{type};
next unless $type; # FIXME Is it ok not to have type defined?
unless ( ref($type) ) {
push @missing_nullable, $column_name;
next;
}
my $null_exists = grep {/^null$/} @$type;
unless ( $null_exists ) {
push @missing_nullable, $column_name;
next;
}
}
}
return @missing_nullable;
}