Analizo
view release on metacpan or search on metacpan
lib/Analizo/Batch/Output/DB.pm view on Meta::CPAN
sub flush($) {
my ($self) = @_;
$self->{dbh}->disconnect();
}
sub _find_row_id($$@) {
my ($self, $sql, @data) = @_;
my $statement_id = 'st_find_' . sha1_hex($sql); # is this SHA1 needed at all?
$self->{$statement_id} ||= $self->{dbh}->prepare($sql);
my $list = $self->{dbh}->selectall_arrayref($self->{$statement_id}, {}, @data);
if (scalar(@$list) == 0) {
return undef;
} else {
return $list->[0]->[0];
}
}
sub _add_project($$) {
my ($self, $project) = @_;
$self->{st_add_project} ||= $self->{dbh}->prepare('INSERT INTO projects (name) values(?)');
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
my $output2 = __create();
$output2->file($OUTFILE);
$output2->initialize();
}
sub add_project_data : Tests {
my $output = __create($OUTFILE);
my $job = Analizo::Batch::Job->new;
$job->directory('/path/to/niceproject');
$output->push($job);
select_one_ok($OUTFILE, "select * from projects where name = 'niceproject'", 'must insert project the first time');
$output->push($job);
select_one_ok($OUTFILE, "select * from projects where name = 'niceproject'", 'must not insert same project twice');
}
sub add_commit_and_developer_data : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job->new);
$job->directory('/path/to/niceproject');
$job->id('XPTO');
$job->mock(
'metadata_hashref',
sub {
{
'author_name' => 'Jonh Doe',
'author_email' => 'jdoe@example.com',
'previous_commit_id' => 'PREVIOUS',
'author_date' => '1313206352',
}
}
);
$output->push($job);
select_one_ok($OUTFILE, "SELECT * FROM commits JOIN projects on (projects.id = commits.project_id) WHERE commits.id = 'XPTO'");
select_one_ok($OUTFILE, "SELECT * FROM developers JOIN commits on (commits.developer_id = developers.id) WHERE developers.name = 'Jonh Doe' AND developers.email = 'jdoe\@example.com' AND commits.id = 'XPTO'");
select_one_ok($OUTFILE, "SELECT * FROM commits WHERE id = 'XPTO' AND previous_commit_id = 'PREVIOUS' AND date = '1313206352'");
# pushing the same data again should not crash
$output->push($job);
}
my $SAMPLE = ('t/samples/animals/cpp');
sub add_module_data_for_modules_changed_by_commit : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job::Directories->new($SAMPLE));
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
}
}
}
);
$job->mock('project_name', sub { 'animals'; });
$output->push($job);
for my $module ('Mammal', 'Dog') {
# module
select_one_ok($OUTFILE, "SELECT * FROM modules JOIN projects ON (projects.id = modules.project_id) WHERE projects.name = 'animals' AND modules.name = '$module'");
# module_versions and commits_module_versions
select_one_ok($OUTFILE, "SELECT * FROM modules JOIN module_versions ON (module_versions.module_id = modules.id) JOIN commits_module_versions ON (commits_module_versions.module_version_id = module_versions.id) JOIN commits ON (commits_module_versi...
}
select_ok($OUTFILE, "SELECT * FROM module_versions JOIN commits_module_versions ON (module_versions.id = commits_module_versions.module_version_id) JOIN commits ON (commits.id = commits_module_versions.commit_id) WHERE commit_id = 'foo'", 3);
select_one_ok($OUTFILE, "SELECT * FROM modules JOIN module_versions ON (module_versions.module_id = modules.id) WHERE modules.name = 'Mammal' AND module_versions.id = '1111111111111111111111111111111111111111'");
# one module with multiple files: concatenate SHA1 of files and calculate the SHA1 of that.
select_one_ok($OUTFILE, "SELECT * FROM modules JOIN module_versions ON (module_versions.module_id = modules.id) WHERE modules.name = 'Dog' AND module_versions.id = '452219454519b29aae2e135c470d97d9e234976b'");
}
sub changed_added_module_versions : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job::Directories->new($SAMPLE));
$job->id('foo');
$job->execute();
$job->mock(
'metadata_hashref',
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
'cat.cc' => '4444444444444444444444444444444444444444',
'cat.h' => '5555555555555555555555555555555555555555',
}
}
}
);
$job->mock('project_name', sub { 'animals'; });
$output->push($job);
select_one_ok($OUTFILE, "SELECT * FROM commits_module_versions WHERE commit_id = 'foo' AND module_version_id = '1111111111111111111111111111111111111111' AND modified AND NOT added");
# 452219454519b29aae2e135c470d97d9e234976b = sha1(22222222222222222222222222222222222222223333333333333333333333333333333333333333)
select_one_ok($OUTFILE, "SELECT * FROM commits_module_versions WHERE commit_id = 'foo' AND module_version_id = '452219454519b29aae2e135c470d97d9e234976b' AND added AND NOT modified");
# f676c6d81e63377edc2f9ec60b1bc2359b94606f = sha1(44444444444444444444444444444444444444445555555555555555555555555555555555555555)
select_one_ok($OUTFILE, "SELECT * FROM commits_module_versions WHERE commit_id = 'foo' AND module_version_id = 'f676c6d81e63377edc2f9ec60b1bc2359b94606f' AND modified AND NOT added");
}
sub module_versions_with_the_same_id : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job::Directories->new($SAMPLE));
$job->mock('project_name', sub { 'animals'; });
$job->id('foo');
$job->execute();
$job->mock(
'metadata_hashref',
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
'mammal.h' => 'M',
},
'files' => {
'animal.h' => '1111111111111111111111111111111111111111',
'mammal.h' => '1111111111111111111111111111111111111111',
}
}
}
);
$output->push($job);
select_ok($OUTFILE, "SELECT * FROM module_versions WHERE id = '1111111111111111111111111111111111111111'", 2);
}
sub global_metrics : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job::Directories->new($SAMPLE));
$job->mock('project_name', sub { 'animals'; });
$job->id('foo');
$job->execute();
$output->push($job);
select_one_ok($OUTFILE, "SELECT * FROM commits where total_abstract_classes > 0");
}
sub files_with_multiple_modules : Tests {
my $output = __create($OUTFILE);
my $job = mock(Analizo::Batch::Job::Directories->new('t/samples/file_with_two_modules/cpp'));
$job->mock('project_name', sub { 'multiple' });
$job->id("foo");
$job->execute;
$job->mock(
'metadata_hashref',
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
},
'files' => {
'classes.cc' => '1111111111111111111111111111111111111111',
'classes.h' => '2222222222222222222222222222222222222222',
'main.cc' => '3333333333333333333333333333333333333333',
}
}
}
);
$output->push($job);
select_ok($OUTFILE, 'SELECT * FROM modules', 3);
}
sub numeric_autoincrement_pk : Tests {
ok(Analizo::Batch::Output::DB::_numeric_autoinc_pk('dbi:SQLite:file.sqlite3') =~ /AUTOINCREMENT/);
ok(Analizo::Batch::Output::DB::_numeric_autoinc_pk('dbi:Pg:dbname=analizo') =~ /SERIAL/);
}
sub __create {
my ($file) = @_;
my $output = Analizo::Batch::Output::DB->new;
t/Analizo/Batch/Output/DB.t view on Meta::CPAN
sub table_created_ok($$) {
my ($db, $table) = @_;
my $dbh = DBI->connect("dbi:SQLite:$db");
my $TABLE = uc($table);
$table = lc($table);
my @tables = $dbh->tables();
my $projects_table = scalar(grep { lc($_) =~ /$table/ } @tables);
ok($projects_table, "must create $TABLE table");
}
sub select_ok($$$) {
my ($db, $query, $count) = @_;
my $dbh = DBI->connect("dbi:SQLite:$db");
my $rows = $dbh->selectall_arrayref($query);
my $row_count = scalar(@$rows);
is($row_count, $count, "[$query] returned $row_count rows instead of exactly $count");
}
sub select_one_ok($$) {
my ($db, $query) = @_;
select_ok($db, $query, 1);
}
__PACKAGE__->runtests;
t/features/metrics_history_db.feature view on Meta::CPAN
Feature: storing VCS data in a database
As a software engineering researcher
I want to store data about the changes in a project
So that I can analyze the development process
Scenario: basics
When I explode t/samples/evolution.tar.gz
And I run "analizo metrics-history -f db -o data.db"
Then the exit status must be 0
When I run "select * from modules" on database "data.db"
Then the output must match "Input"
And the output must match "Output"
And the output must match "prog"
t/features/step_definitions/analizo_steps.pl view on Meta::CPAN
$exit_status = $?;
local $/ = undef;
$stdout = <$STDOUT>;
$stderr = <$STDERR> . read_file('tmp.err');
};
When qr/^I run "([^\"]*)" on database "([^\"]*)"$/, sub {
my ($c) = @_;
my $statement = $1;
my $db = $2;
my @a = DBI->connect("dbi:SQLite:$db")->selectall_array($statement);
$stdout = join("\n", map { join("|", @$_) } @a), "\n";
};
Then qr/^the output must match "([^\"]*)"$/, sub {
my ($c) = @_;
like($stdout, qr/$1|\Q$1\E/);
};
Then qr/^the output must not match "([^\"]*)"$/, sub {
my ($c) = @_;
( run in 1.070 second using v1.01-cache-2.11-cpan-49f99fa48dc )