start fixing test for multi cat phenotype upload.
[sgn.git] / t / unit_fixture / CXGN / Uploading / UploadIntercrossData.t
blob83b73e7f20e530df4de70fece40e3dcbb2be5a9e
1 use strict;
2 use warnings;
4 use lib 't/lib';
5 use SGN::Test::Fixture;
6 use Test::More;
7 use Test::WWW::Mechanize;
8 use LWP::UserAgent;
9 use SGN::Model::Cvterm;
10 use CXGN::Trial::Download;
11 use Spreadsheet::WriteExcel;
12 use Spreadsheet::Read;
13 use Data::Dumper;
14 use JSON;
15 local $Data::Dumper::Indent = 0;
16 my $f = SGN::Test::Fixture->new();
17 my $schema = $f->bcs_schema;
19 my $mech = Test::WWW::Mechanize->new;
21 $mech->post_ok('http://localhost:3010/brapi/v1/token', [ "username"=> "janedoe", "password"=> "secretpw", "grant_type"=> "password" ]);
22 my $response = decode_json $mech->content;
23 is($response->{'metadata'}->{'status'}->[2]->{'message'}, 'Login Successfull');
24 my $sgn_session_id = $response->{access_token};
25 print STDERR $sgn_session_id."\n";
27 # adding a crossing experiment for intercross upload
28 $mech->post_ok('http://localhost:3010/ajax/cross/add_crossingtrial', [ 'crossingtrial_name' => 'intercross_upload', 'crossingtrial_program_id' => 134 ,
29     'crossingtrial_location' => 'test_location', 'year' => '2020', 'project_description' => 'test intercross upload' ]);
31 $response = decode_json $mech->content;
32 is($response->{'success'}, '1');
34 my $crossing_experiment_rs = $schema->resultset('Project::Project')->find({name =>'intercross_upload'});
35 my $crossing_experiment_id = $crossing_experiment_rs->project_id();
37 #test uploading target numbers
38 my $target_numbers_type_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'target_numbers_json', 'project_property')->cvterm_id();
39 my $before_uploading_target_numbers_all_projectprop = $schema->resultset("Project::Projectprop")->search({})->count();
40 my $before_uploading_target_numbers = $schema->resultset("Project::Projectprop")->search({ project_id => $crossing_experiment_id, type_id => $target_numbers_type_id })->count();
42 for my $extension ("xls", "xlsx") {
43     my $file = $f->config->{basepath} . "/t/data/cross/target_numbers.$extension";
44     my $ua = LWP::UserAgent->new;
45     my $response = $ua->post(
46         'http://localhost:3010/ajax/crossing_experiment/upload_target_numbers',
47         Content_Type => 'form-data',
48         Content => [
49             "target_numbers_file" => [
50                 $file,
51                 "target_numbers.$extension",
52                 Content_Type => ($extension eq "xls") ? 'application/vnd.ms-excel' : 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
53             ],
54             "target_numbers_experiment_id" => $crossing_experiment_id,
55             "sgn_session_id" => $sgn_session_id
56         ]
57     );
58     ok($response->is_success);
59     my $message = $response->decoded_content;
60     my $message_hash = decode_json $message;
61     is_deeply($message_hash, { 'success' => 1 });
64 my $after_uploading_target_numbers_all_projectprop = $schema->resultset("Project::Projectprop")->search({})->count();
65 my $after_uploading_target_numbers = $schema->resultset("Project::Projectprop")->search({ project_id => $crossing_experiment_id, type_id => $target_numbers_type_id })->count();
67 is($after_uploading_target_numbers_all_projectprop, $before_uploading_target_numbers_all_projectprop + 1);
68 is($after_uploading_target_numbers, $before_uploading_target_numbers + 1);
70 #retrieving target number
71 $mech->post_ok("http://localhost:3010/ajax/crossing_experiment/target_numbers_and_progress/$crossing_experiment_id");
72 $response = decode_json $mech->content;
73 is_deeply($response, { 'data' => [
74     ['UG120001','UG120002',50,undef,25,undef,''],
75     ['UG120002','UG120003',40,undef,20,undef,'']
76 ]}, 'target numbers');
79 #uploading intercross data
80 my $cross_type_id = SGN::Model::Cvterm->get_cvterm_row($schema, "cross", "stock_type")->cvterm_id();
81 my $before_uploading_cross = $schema->resultset("Stock::Stock")->search({ type_id => $cross_type_id})->count();
82 my $before_uploading_stocks = $schema->resultset("Stock::Stock")->search({})->count();
83 my $before_uploading_relationship = $schema->resultset("Stock::StockRelationship")->search({})->count();
84 my $cross_identifier_type_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'cross_identifier', 'stock_property')->cvterm_id();
85 my $before_upload_identifier_rows = $schema->resultset("Stock::Stockprop")->search({type_id => $cross_identifier_type_id})->count();
87 my $file = $f->config->{basepath}."/t/data/cross/intercross_upload.csv";
88 my $ua = LWP::UserAgent->new;
89 $response = $ua->post(
90     'http://localhost:3010/ajax/cross/upload_intercross_file',
91     Content_Type => 'form-data',
92     Content => [
93         "intercross_file" => [ $file, 'intercross_upload.csv', Content_Type => 'text/plain', ],
94         "sgn_session_id" => $sgn_session_id,
95         "cross_id_format_option" => 'auto_generated_id',
96         "intercross_experiment_id" => $crossing_experiment_id
97     ]
99 ok($response->is_success);
100 my $message = $response->decoded_content;
101 my $message_hash = decode_json $message;
102 is_deeply($message_hash, {'success' => 1});
104 my $after_uploading_cross = $schema->resultset("Stock::Stock")->search({ type_id => $cross_type_id})->count();
105 my $after_uploading_stocks = $schema->resultset("Stock::Stock")->search({})->count();
106 my $after_uploading_relationship = $schema->resultset("Stock::StockRelationship")->search({})->count();
108 is($after_uploading_cross, $before_uploading_cross + 2);
109 is($after_uploading_stocks, $before_uploading_stocks + 2);
110 is($after_uploading_relationship, $before_uploading_relationship + 4);
112 #retrieving target number and progress
113 $mech->post_ok("http://localhost:3010/ajax/crossing_experiment/target_numbers_and_progress/$crossing_experiment_id");
114 $response = decode_json $mech->content;
115 my $target_data = $response->{'data'};
117 is($target_data->[0]->[0], 'UG120001');
118 is($target_data->[0]->[1], 'UG120002');
119 is($target_data->[0]->[2], 50);
120 is($target_data->[0]->[3], 35);
121 is($target_data->[0]->[4], 25);
122 is($target_data->[0]->[5], 0);
124 is($target_data->[1]->[0], 'UG120002');
125 is($target_data->[1]->[1], 'UG120003');
126 is($target_data->[1]->[2], 40);
127 is($target_data->[1]->[3], 25);
128 is($target_data->[1]->[4], 20);
129 is($target_data->[1]->[5], 0);
131 # checking number of crosses in intercross_upload experiment
132 $mech->post_ok("http://localhost:3010/ajax/breeders/trial/$crossing_experiment_id/crosses_and_details_in_trial");
133 $response = decode_json $mech->content;
134 my %data = %$response;
135 my $crosses = $data{data};
136 my $number_of_crosses = @$crosses;
137 is($number_of_crosses, 2);
139 # checking transactions in intercross_upload_1
140 my $intercross_upload_1_id = $schema->resultset('Stock::Stock')->find({ name => 'intercross_upload_1' })->stock_id();
141 $mech->post_ok("http://localhost:3010/ajax/cross/transactions/$intercross_upload_1_id");
142 $response = decode_json $mech->content;
143 my %result = %$response;
144 my $transactions = $result{data};
145 my $number_of_transactions = @$transactions;
146 is($number_of_transactions, 2);
148 #checking stockprop
149 my $cross_transaction_type_id = SGN::Model::Cvterm->get_cvterm_row($schema, 'cross_transaction_json', 'stock_property')->cvterm_id();
150 my $transaction_rows = $schema->resultset("Stock::Stockprop")->search({type_id => $cross_transaction_type_id})->count();
151 is($transaction_rows, 2);
153 my $after_upload_identifier_rows = $schema->resultset("Stock::Stockprop")->search({type_id => $cross_identifier_type_id})->count();
154 is($after_upload_identifier_rows, $before_upload_identifier_rows + 2);
156 #test crossing experiment download with transaction info
157 my @cross_properties = ("Tag Number", "Pollination Date", "Number of Bags", "Number of Flowers", "Number of Fruits", "Number of Seeds");
158 my $tempfile = "/tmp/test_download_crossing_experiment.xls";
159 my $format = 'CrossingExperimentXLS';
160 my $create_spreadsheet = CXGN::Trial::Download->new({
161     bcs_schema => $f->bcs_schema,
162     trial_list => [$crossing_experiment_id],
163     filename => $tempfile,
164     format => $format,
165     field_crossing_data_order => \@cross_properties
168 $create_spreadsheet->download();
169 my $contents = ReadData $tempfile;
171 my $columns = $contents->[1]->{'cell'};
172 my @column_array = @$columns;
173 my $number_of_columns = scalar @column_array;
174 ok(scalar($number_of_columns) == 22, "check number of columns.");
176 is_deeply($contents->[1]->{'cell'}->[1], [
177     undef,
178     'Cross Unique ID',
179     'intercross_upload_1',
180     'intercross_upload_2'
181 ], "check cross unique ids column");
183 my $transaction_column = $contents->[1]->{'cell'}->[21];
184 my @transaction_array = @$transaction_column;
185 my $correct_grouping_1;
186 my $correct_grouping_2;
188 if ('transaction_id_0001,transaction_id_0004' ~~ @transaction_array){
189     $correct_grouping_1 = 1;
190 } else {
191     $correct_grouping_1 = 0
194 if ('transaction_id_0002,transaction_id_0003' ~~ @transaction_array){
195     $correct_grouping_2 = 1;
196 } else {
197     $correct_grouping_2 = 0
200 is($correct_grouping_1, 1);
201 is($correct_grouping_2, 1);
203 #deleting crosses and crossing experiment after testing
204 $mech->post_ok('http://localhost:3010/ajax/cross/delete', [ 'cross_id' => $intercross_upload_1_id]);
205 $response = decode_json $mech->content;
206 is_deeply($message_hash, {'success' => 1});
208 my $intercross_upload_2_id = $schema->resultset('Stock::Stock')->find({name =>'intercross_upload_2'})->stock_id();
209 $mech->post_ok('http://localhost:3010/ajax/cross/delete', [ 'cross_id' => $intercross_upload_2_id]);
210 $response = decode_json $mech->content;
211 is_deeply($message_hash, {'success' => 1});
213 $mech->get_ok('http://localhost:3010/ajax/breeders/trial/'.$crossing_experiment_id.'/delete/crossing_experiment');
214 $response = decode_json $mech->content;
215 is_deeply($message_hash, {'success' => 1});
217 $f->clean_up_db();
220 done_testing();