#!/usr/bin/perl use strict; use warnings; #use Test::More 'no_plan'; use Test::More tests => 25; use Test::Exception; =begin # tests: tests foreign key constraint prevents deletion of parent row if it exists in a child table - uses default data from test-lib.pl =cut BEGIN { require 't/test-lib.pl'; } my ($dbh, $dbix); eval { $dbh = get_dbh() or die 'no database handle recieved from get_dbh'; }; warn $@ if $@; # supress error warnings to console: local $dbh->{'RaiseError'} = 1; # default local $dbh->{'PrintError'} = 0; # override # do_delete() expects fk col in child table to be singular of parent table + _id # or use args->{col} { # audit_request_options -> audit_request_categories: my %args = ( child => 'audit_request_options', col => 'category_id', parent => 'audit_request_categories', ); do_delete(\%args); } { # diagnoses -> diagnostic_categories: my %args = ( child => 'diagnoses', col => 'diagnostic_category_id', parent => 'diagnostic_categories', ); do_delete(\%args); } { # lab_tests -> lab_sections: my %args = ( child => 'lab_tests', parent => 'lab_sections', ); do_delete(\%args); } { # parent_organisations -> referral_types: my %args = ( child => 'parent_organisations', parent => 'referral_types', row => 4, ); do_delete(\%args); } { # patient_case -> patients: my %args = ( child => 'patient_case', parent => 'patients', ); do_delete(\%args); } { # patient_case -> referral_sources: my %args = ( child => 'patient_case', parent => 'referral_sources', ); do_delete(\%args); } { # referral_sources -> parent_organisations: my %args = ( child => 'referral_sources', parent => 'parent_organisations', ); do_delete(\%args); } { # referral_sources -> referral_types: my %args = ( child => 'referral_sources', parent => 'referral_types', row => 3, ); do_delete(\%args); } { # referrer_department -> parent_organisation: my %args = ( child => 'referrer_department', parent => 'parent_organisations', ); do_delete(\%args); } { # referrer_department -> referrers: my %args = ( child => 'referrer_department', parent => 'referrers', ); do_delete(\%args); } { # referrers -> referral_types: my %args = ( child => 'referrers', parent => 'referral_types', ); do_delete(\%args); } { # requests - patient_case: my %args = ( child => 'requests', col => 'patient_case_id', parent => 'patient_case', ); do_delete(\%args); } { # requests - referrer_department: my %args = ( child => 'requests', col => 'referrer_department_id', parent => 'referrer_department', ); do_delete(\%args); } { # request_consent -> consent_options: my %args = ( child => 'request_consent', col => 'consent_id', parent => 'consent_options', ); do_delete(\%args); } { # request_specimen - specimens: my %args = ( child => 'request_specimen', parent => 'specimens', ); do_delete(\%args); } { # request_trial -> clinical_trials: my %args = ( child => 'request_trial', col => 'trial_id', parent => 'clinical_trials', ); do_delete(\%args); } { # result_summary_options -> lab_sections: my %args = ( child => 'result_summary_options', parent => 'lab_sections', ); do_delete(\%args); } { # screen_lab_test -> lab_tests: my %args = ( child => 'screen_lab_test', parent => 'lab_tests', ); do_delete(\%args); } { # screen_lab_test -> screens: my %args = ( child => 'screen_lab_test', parent => 'screens', ); do_delete(\%args); } { # screen_lab_test_detail -> screens: my %args = ( child => 'screen_lab_test_detail', parent => 'screens', ); do_delete(\%args); } { # screen_lab_test_detail -> lab_tests: my %args = ( child => 'screen_lab_test_detail', parent => 'lab_sections', ); do_delete(\%args); } { # users -> user_locations: my %args = ( child => 'users', parent => 'user_locations', ); do_delete(\%args); } { # users -> user_groups: my %args = ( child => 'users', col => 'group_id', parent => 'user_groups', ); do_delete(\%args); } { # user_group_function -> user_groups: my %args = ( child => 'user_group_function', col => 'group_id', parent => 'user_groups', ); do_delete(\%args); } { # user_group_function -> user_functions: my %args = ( child => 'user_group_function', col => 'function_id', parent => 'user_functions', ); do_delete(\%args); } sub do_delete { my $args = shift; my $parent_tbl = $args->{parent}; # warn $parent_tbl; my $child_tbl = $args->{child}; # warn $child_tbl; my $row_number = $args->{row} || 1; # default = row #1 my $fk_col = $args->{col} || ''; # only supplied if non-standard _id if (! $fk_col) { $fk_col = $parent_tbl; $fk_col =~ s/s\Z//; # remove trailing 's' $fk_col .= '_id'; } # warn $fk_col; my $fk_name = $child_tbl . '_ibfk'; # warn $fk_name; $dbh->do( qq!ALTER TABLE `$child_tbl` ADD CONSTRAINT `$fk_name` FOREIGN KEY (`$fk_col`) REFERENCES `$parent_tbl` (`id`)! ); dies_ok { $dbh->do( qq!delete from $parent_tbl where id = $row_number! ); } "OK: expecting to die on delete from $parent_tbl"; $dbh->do( qq!ALTER TABLE `$child_tbl` DROP FOREIGN KEY `$fk_name`! ); }