Skip to content

Commit

Permalink
Add tests for utility subroutine in Step.pm
Browse files Browse the repository at this point in the history
  • Loading branch information
Wabri committed Feb 6, 2025
1 parent d984b18 commit 6fdd72c
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 1 deletion.
55 changes: 54 additions & 1 deletion lib/OpenQA/WebAPI/Controller/Step.pm
Original file line number Diff line number Diff line change
@@ -1,6 +1,28 @@
# Copyright 2014-2021 SUSE LLC
# SPDX-License-Identifier: GPL-2.0-or-later

=head1 NAME
OpenQA::WebAPI::Controller::Step - Handles test step rendering in OpenQA.
=head1 SYNOPSIS
use OpenQA::WebAPI::Controller::Step;
# Example usage inside a Mojolicious route
my $controller = OpenQA::WebAPI::Controller::Step->new;
$controller->view();
=head1 DESCRIPTION
This module is a Mojolicious controller responsible for:
- Fetching and displaying test steps: screenshots, text logs and audio.
- Handling needle matching for OpenQA tests.
- Managing needle storage and retrieval with git-based.
- Providing AJAX responses for web-based test analysis.
=cut

package OpenQA::WebAPI::Controller::Step;
use Mojo::Base 'Mojolicious::Controller', -signatures;

Expand All @@ -23,6 +45,8 @@ sub _init ($self) {
return 0 unless my $job = $self->app->schema->resultset('Jobs')->find($self->param('testid'));
my %attrs = (rows => 1, order_by => {-desc => 'id'});
my $module = $job->modules->find({name => $self->param('moduleid')}, \%attrs) or return 0;
# return 0 unless my $module = $job->modules->find({name => $self->param('moduleid')}, \%attrs);

$self->stash(job => $job);
$self->stash(testname => $job->name);
$self->stash(distri => $job->DISTRI);
Expand Down Expand Up @@ -94,6 +118,34 @@ sub view ($self) {
$self->viewimg;
}

=head2 _determine_needles_dir_for_job
my ($needle_dirs, $needles_var) = $self->_determine_needles_dir_for_job($job);
Get the directory where needle files are stored for a given job.
It checks whether the Git-based needle management is enabled.
If enabled, it fetches the path to the needles directory and for NEEDLES_DIR or CASEDIR.
=head3 Parameters
=over 4
=item * $job - OpenQA job
=back
=head3 Returns
=over 4
=item * A list containing:
- The absolute path to the needles directory.
- the configured needles directory needles_dir or casedir
=back
=cut
sub _determine_needles_dir_for_job ($self, $job) {
return undef unless $self->app->config->{'scm git'}->{checkout_needles_sha} eq 'yes';
return undef unless my $needle_dirs = realpath($job->needle_dir);
Expand All @@ -113,7 +165,8 @@ sub _create_tmpdir_for_needles_refspec ($self, $job) {
};
chomp $needles_ref;
return undef unless $needles_ref;
return undef unless run_cmd_with_log ['git', '-C', $needle_dirs, 'fetch', '--depth', 1, 'origin', $needles_ref];
my $cmd_status = run_cmd_with_log ['git', '-C', $needle_dirs, 'fetch', '--depth', 1, 'origin', $needles_ref];
return undef unless $cmd_status;
my $rev_parse_res = run_cmd_with_log_return_error ['git', '-C', $needle_dirs, 'rev-parse', 'FETCH_HEAD'];
return undef unless $rev_parse_res->{status};
$needles_ref = $rev_parse_res->{stdout};
Expand Down
47 changes: 47 additions & 0 deletions t/21-needles.t
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,14 @@ require OpenQA::Test::Database;
use OpenQA::Test::TimeLimit '10';
use OpenQA::Task::Needle::Scan;
use File::Find;
use File::Temp qw(tempdir);
use Mojo::File qw(path);
use Time::Seconds;
use Test::Output 'combined_like';
use Test::Mojo;
use Test::MockModule;
use OpenQA::Utils qw(ensure_timestamp_appended find_bug_number needledir testcasedir
run_cmd_with_log run_cmd_with_log_return_error);
use Test::Warnings ':report_warnings';
use Date::Format 'time2str';

Expand All @@ -32,6 +37,10 @@ my %settings = (
ARCH => 'x86_64',
);

my $mock = Test::MockModule->new('OpenQA::Utils');
$mock->redefine('run_cmd_with_log', sub { 1 });
$mock->redefine('run_cmd_with_log_return_error', sub($cmd, %args) { return {status => 1, stdout => '0123456789abcdef0123456789abcdef01234567', stderr => 'Error message'} });

my $schema = OpenQA::Test::Database->new->create;
my $needledir_archlinux = 't/data/openqa/share/tests/archlinux/needles';
my $needledir_fedora = 't/data/openqa/share/tests/fedora/needles';
Expand Down Expand Up @@ -168,4 +177,42 @@ subtest 'handling relative paths in update_needle' => sub {
};
};

subtest '_determine_needles_dir_for_job' => sub {
my $controller = OpenQA::WebAPI::Controller::Step->new;
$controller->app($t->app);
$settings{CASEDIR} = 'https://something#fragment';
my $sandbox = tempdir(CLEANUP => 1);
my $job = $schema->resultset('Jobs')->create_from_settings(\%settings);
$job->update({result_dir => $sandbox});

# test checkout_needles_sha = no
$controller->app->config->{'scm git'} = {checkout_needles_sha => 'no'};
my ($needle_dirs, $needles_var) = $controller->_determine_needles_dir_for_job($job);
is($needle_dirs, undef, 'needles directory determined');
is($needles_var, undef, 'needles var determined');

# test checkout_needles_sha = yes
$controller->app->config->{'scm git'} = {checkout_needles_sha => 'yes'};
($needle_dirs, $needles_var) = $controller->_determine_needles_dir_for_job($job);
like($needle_dirs, qr|t/data/openqa/share/tests/fedora/needles$|, 'needles dirs is defined');
is($needles_var->value, 'https://something#fragment', 'needles var is defined');
};

subtest '_create_tmpdir_for_needles_refspec' => sub {
my $sandbox = tempdir(CLEANUP => 1);
my $vars_json = path($sandbox, 'vars.json');
$vars_json->spew('{"NEEDLES_GIT_HASH": "0123456789abcdef0123456789abcdef01234567"}');
my $controller = OpenQA::WebAPI::Controller::Step->new;
$controller->app($t->app);
$settings{CASEDIR} = 'https://something#fragment';
$job = $schema->resultset('Jobs')->create_from_settings(\%settings);
$job->update({result_dir => $sandbox});
$controller->app->config->{'scm git'} = {checkout_needles_sha => 'yes'};

my $needle_refs = $controller->_create_tmpdir_for_needles_refspec($job);

like($needle_refs, qr/[a-f0-9]{40}/, 'needles refs is defined with a fragment');
# is($needle_refs, 'fragment', 'needles refs is defined with a fragment');
};

done_testing;

0 comments on commit 6fdd72c

Please sign in to comment.