1<?php
2/*
3Copyright (C) 2015, Siemens AG
4
5This program is free software; you can redistribute it and/or
6modify it under the terms of the GNU General Public License
7version 2 as published by the Free Software Foundation.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License along
15with this program; if not, write to the Free Software Foundation, Inc.,
1651 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17*/
18
19namespace Fossology\Lib\Application;
20
21use Fossology\Lib\BusinessRules\LicenseMap;
22use Fossology\Lib\Db\DbManager;
23use Fossology\Lib\Test\TestPgDb;
24use Mockery as M;
25
26/**
27 * @class LicenseCsvExportTest
28 * @brief Test for class LicenseCsvExport
29 */
30class LicenseCsvExportTest extends \PHPUnit\Framework\TestCase
31{
32  /**
33   * @brief One time setup for test
34   * @see PHPUnit::Framework::TestCase::setUp()
35   */
36  protected function setUp()
37  {
38    $this->assertCountBefore = \Hamcrest\MatcherAssert::getCount();
39  }
40
41  /**
42   * @brief Close mockery
43   * @see PHPUnit::Framework::TestCase::tearDown()
44   */
45  protected function tearDown()
46  {
47    $this->addToAssertionCount(\Hamcrest\MatcherAssert::getCount()-$this->assertCountBefore);
48    M::close();
49  }
50
51  /**
52   * @brief Test for LicenseCsvExport::createCsv()
53   * @test
54   * -# Setup test DB and insert some licenses.
55   * -# Call LicenseCsvExport::createCsv().
56   * -# Check if the file returned is correct.
57   * -# Test with different delimiters.
58   */
59  public function testCreateCsv()
60  {
61    $testDb = new TestPgDb("licenseCsvExport");
62    $testDb->createPlainTables(array('license_ref','license_map','groups','obligation_ref','obligation_map'));
63    $testDb->createInheritedTables(array('license_candidate'));
64    $dbManager = $testDb->getDbManager();
65    $licenses = array();
66    $candLicenses = array();
67    $dbManager->insertTableRow('groups', array(
68      'group_pk' => 2, 'group_name' => 'test'
69    ));
70    for ($i = 1; $i < 4; $i ++) {
71      $licenses[$i] = array(
72        'rf_pk' => $i,
73        'rf_shortname' => 'lic' . $i,
74        'rf_fullname' => 'lice' . $i,
75        'rf_text' => 'text' . $i,
76        'rf_url' => $i . $i,
77        'rf_notes' => 'note' . $i,
78        'rf_source' => 's' . $i,
79        'rf_detector_type' => 1,
80        'rf_risk' => ($i - 1)
81      );
82      $dbManager->insertTableRow('license_ref', $licenses[$i]);
83    }
84    for ($i = 1; $i <= 4; $i ++) {
85      $candLicenses[$i] = array(
86        'rf_pk' => $i + 4,
87        'rf_shortname' => 'candlic' . $i,
88        'rf_fullname' => 'candlice' . $i,
89        'rf_text' => 'text' . $i,
90        'rf_url' => $i . $i,
91        'rf_notes' => 'note' . $i,
92        'rf_source' => 's' . $i,
93        'rf_detector_type' => 1,
94        'rf_risk' => ($i - 1),
95        'marydone' => false,
96        'group_fk' => 2
97      );
98      if ($i % 2 == 0) {
99        $candLicenses[$i]['marydone'] = true;
100      }
101      $dbManager->insertTableRow('license_candidate', $candLicenses[$i]);
102    }
103
104    $dbManager->insertTableRow('license_map', array('rf_fk'=>3,'rf_parent'=>1,'usage'=>LicenseMap::CONCLUSION));
105    $dbManager->insertTableRow('license_map', array('rf_fk'=>3,'rf_parent'=>2,'usage'=>LicenseMap::REPORT));
106
107    $licenseCsvExport = new LicenseCsvExport($dbManager);
108    $head = array('shortname','fullname','text','parent_shortname','report_shortname','url','notes','source','risk','group', 'obligations');
109    $out = fopen('php://output', 'w');
110
111    $csv = $licenseCsvExport->createCsv();
112    ob_start();
113    fputcsv($out, $head);
114    fputcsv($out, array($licenses[1]['rf_shortname'],
115        $licenses[1]['rf_fullname'],
116        $licenses[1]['rf_text'],
117        null,
118        null,
119        $licenses[1]['rf_url'],
120        $licenses[1]['rf_notes'],
121        $licenses[1]['rf_source'],
122        $licenses[1]['rf_risk'],
123        null, null));
124
125    fputcsv($out, array($licenses[2]['rf_shortname'],
126        $licenses[2]['rf_fullname'],
127        $licenses[2]['rf_text'],
128        null,
129        null,
130        $licenses[2]['rf_url'],
131        $licenses[2]['rf_notes'],
132        $licenses[2]['rf_source'],
133        $licenses[2]['rf_risk'],
134        null, null));
135
136    fputcsv($out, array($licenses[3]['rf_shortname'],
137        $licenses[3]['rf_fullname'],
138        $licenses[3]['rf_text'],
139        $licenses[1]['rf_shortname'],
140        $licenses[2]['rf_shortname'],
141        $licenses[3]['rf_url'],
142        $licenses[3]['rf_notes'],
143        $licenses[3]['rf_source'],
144        $licenses[3]['rf_risk'],
145        null, null));
146
147    fputcsv($out, array($candLicenses[2]['rf_shortname'],
148      $candLicenses[2]['rf_fullname'],
149      $candLicenses[2]['rf_text'],
150      null,
151      null,
152      $candLicenses[2]['rf_url'],
153      $candLicenses[2]['rf_notes'],
154      $candLicenses[2]['rf_source'],
155      $candLicenses[2]['rf_risk'],
156      "test", null));
157
158    fputcsv($out, array($candLicenses[4]['rf_shortname'],
159      $candLicenses[4]['rf_fullname'],
160      $candLicenses[4]['rf_text'],
161      null,
162      null,
163      $candLicenses[4]['rf_url'],
164      $candLicenses[4]['rf_notes'],
165      $candLicenses[4]['rf_source'],
166      $candLicenses[4]['rf_risk'],
167      "test", null));
168    $expected = ob_get_contents();
169    ob_end_clean();
170
171    assertThat($csv, is(equalTo($expected)));
172
173    $delimiter = '|';
174    $licenseCsvExport->setDelimiter($delimiter);
175    $csv3 = $licenseCsvExport->createCsv(3);
176    ob_start();
177    fputcsv($out, $head, $delimiter);
178    fputcsv($out, array($licenses[3]['rf_shortname'],
179          $licenses[3]['rf_fullname'],
180          $licenses[3]['rf_text'],
181          $licenses[1]['rf_shortname'],
182          $licenses[2]['rf_shortname'],
183          $licenses[3]['rf_url'],
184          $licenses[3]['rf_notes'],
185          $licenses[3]['rf_source'],
186          $licenses[3]['rf_risk'],
187          null, null
188        ),
189        $delimiter);
190    $expected3 = ob_get_contents();
191    ob_end_clean();
192    assertThat($csv3, is(equalTo($expected3)));
193  }
194
195  /**
196   * @brief Test for LicenseCsvExport::setDelimiter()
197   * @test
198   * -# Initialize LicenseCsvExport.
199   * -# Set a new delimiter using LicenseCsvExport::setDelimiter().
200   * -# Check if the delimiter is changed.
201   * -# Set a new delimiter using LicenseCsvExport::setDelimiter().
202   * -# Check if the delimiter is changed with only the first character passed.
203   */
204  public function testSetDelimiter()
205  {
206    $dbManager = M::mock(DbManager::class);
207    $licenseCsvExport = new LicenseCsvExport($dbManager);
208    $reflection = new \ReflectionClass($licenseCsvExport);
209    $delimiter = $reflection->getProperty('delimiter');
210    $delimiter->setAccessible(true);
211
212    $licenseCsvExport->setDelimiter('|');
213    assertThat($delimiter->getValue($licenseCsvExport),is('|'));
214
215    $licenseCsvExport->setDelimiter('<>');
216    assertThat($delimiter->getValue($licenseCsvExport),is('<'));
217  }
218
219  /**
220   * @brief Test for LicenseCsvExport::setEnclosure()
221   * @test
222   * -# Initialize LicenseCsvExport.
223   * -# Set a new enclosure using LicenseCsvExport::setEnclosure().
224   * -# Check if the enclosure is changed.
225   * -# Set a new enclosure using LicenseCsvExport::setEnclosure().
226   * -# Check if the enclosure is changed with only the first character passed.
227   */
228  public function testSetEnclosure()
229  {
230    $dbManager = M::mock(DbManager::class);
231    $licenseCsvExport = new LicenseCsvExport($dbManager);
232    $reflection = new \ReflectionClass($licenseCsvExport);
233    $enclosure = $reflection->getProperty('enclosure');
234    $enclosure->setAccessible(true);
235
236    $licenseCsvExport->setEnclosure('|');
237    assertThat($enclosure->getValue($licenseCsvExport),is('|'));
238
239    $licenseCsvExport->setEnclosure('<>');
240    assertThat($enclosure->getValue($licenseCsvExport),is('<'));
241  }
242}
243