3 declare(strict_types
=1);
5 namespace PhpMyAdmin\Tests\Plugins\Export
;
7 use PhpMyAdmin\ConfigStorage\Relation
;
8 use PhpMyAdmin\Dbal\DatabaseInterface
;
9 use PhpMyAdmin\Export\Export
;
10 use PhpMyAdmin\Http\Factory\ServerRequestFactory
;
11 use PhpMyAdmin\Plugins\Export\ExportCodegen
;
12 use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyMainGroup
;
13 use PhpMyAdmin\Properties\Options\Groups\OptionsPropertyRootGroup
;
14 use PhpMyAdmin\Properties\Options\Items\HiddenPropertyItem
;
15 use PhpMyAdmin\Properties\Options\Items\SelectPropertyItem
;
16 use PhpMyAdmin\Properties\Plugins\ExportPluginProperties
;
17 use PhpMyAdmin\Tests\AbstractTestCase
;
18 use PhpMyAdmin\Transformations
;
19 use PHPUnit\Framework\Attributes\CoversClass
;
20 use PHPUnit\Framework\Attributes\Medium
;
22 use ReflectionProperty
;
24 use function ob_get_clean
;
25 use function ob_start
;
27 #[CoversClass(ExportCodegen::class)]
29 class ExportCodegenTest
extends AbstractTestCase
31 protected ExportCodegen
$object;
34 * Configures global environment.
36 protected function setUp(): void
40 $dbi = $this->createDatabaseInterface();
41 DatabaseInterface
::$instance = $dbi;
42 $this->object = new ExportCodegen(
45 new Transformations(),
50 * tearDown for test cases
52 protected function tearDown(): void
59 public function testSetProperties(): void
61 $method = new ReflectionMethod(ExportCodegen
::class, 'setProperties');
62 $method->invoke($this->object, null);
64 $attrProperties = new ReflectionProperty(ExportCodegen
::class, 'properties');
65 $properties = $attrProperties->getValue($this->object);
67 self
::assertInstanceOf(ExportPluginProperties
::class, $properties);
71 $properties->getText(),
76 $properties->getExtension(),
81 $properties->getMimeType(),
86 $properties->getOptionsText(),
89 $options = $properties->getOptions();
91 self
::assertInstanceOf(OptionsPropertyRootGroup
::class, $options);
94 'Format Specific Options',
98 $generalOptionsArray = $options->getProperties();
99 $generalOptions = $generalOptionsArray->current();
101 self
::assertInstanceOf(OptionsPropertyMainGroup
::class, $generalOptions);
105 $generalOptions->getName(),
108 $generalProperties = $generalOptions->getProperties();
110 $hidden = $generalProperties->current();
111 $generalProperties->next();
113 self
::assertInstanceOf(HiddenPropertyItem
::class, $hidden);
120 $select = $generalProperties->current();
122 self
::assertInstanceOf(SelectPropertyItem
::class, $select);
135 ['NHibernate C# DO', 'NHibernate XML'],
136 $select->getValues(),
140 public function testExportHeader(): void
143 $this->object->exportHeader(),
147 public function testExportFooter(): void
150 $this->object->exportFooter(),
154 public function testExportDBHeader(): void
157 $this->object->exportDBHeader('testDB'),
161 public function testExportDBFooter(): void
164 $this->object->exportDBFooter('testDB'),
168 public function testExportData(): void
170 Export
::$outputKanjiConversion = false;
171 Export
::$outputCharsetConversion = false;
172 Export
::$bufferNeeded = false;
173 Export
::$asFile = true;
174 Export
::$saveOnServer = false;
176 $request = ServerRequestFactory
::create()->createServerRequest('POST', 'https://example.com/')
177 ->withParsedBody(['codegen_format' => '1']);
179 $this->object->setExportOptions($request, []);
182 $this->object->exportData('test_db', 'test_table', 'SELECT * FROM `test_db`.`test_table`;');
183 $result = ob_get_clean();
185 self
::assertIsString($result);
187 '<?xml version="1.0" encoding="utf-8" ?>' . "\n"
188 . '<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test_db" assembly="Test_db">' . "\n"
189 . ' <class name="Test_table" table="Test_table">' . "\n"
190 . ' <id name="Id" type="Int32" unsaved-value="0">' . "\n"
191 . ' <column name="id" sql-type="int" not-null="true" unique="true" index="PRIMARY"/>' . "\n"
192 . ' <generator class="native" />' . "\n"
194 . ' <property name="Name" type="String">' . "\n"
195 . ' <column name="name" sql-type="varchar" not-null="true" />' . "\n"
196 . ' </property>' . "\n"
197 . ' <property name="Datetimefield" type="DateTime">' . "\n"
198 . ' <column name="datetimefield" sql-type="datetime" not-null="true" />' . "\n"
199 . ' </property>' . "\n"
201 . '</hibernate-mapping>',
206 public function testCgMakeIdentifier(): void
210 ExportCodegen
::cgMakeIdentifier('Ⅲ{}96`{}foo', true),
215 ExportCodegen
::cgMakeIdentifier('`98testⅢ{}96`{}', true),
220 ExportCodegen
::cgMakeIdentifier('`98testⅢ{}96`{}', false),
224 public function testHandleNHibernateCSBody(): void
226 $method = new ReflectionMethod(ExportCodegen
::class, 'handleNHibernateCSBody');
227 $result = $method->invoke($this->object, 'test_db', 'test_table');
230 'using System;' . "\n" .
231 'using System.Collections;' . "\n" .
232 'using System.Collections.Generic;' . "\n" .
233 'using System.Text;' . "\n" .
234 'namespace Test_db' . "\n" .
236 ' #region Test_table' . "\n" .
237 ' public class Test_table' . "\n" .
239 ' #region Member Variables' . "\n" .
240 ' protected int _id;' . "\n" .
241 ' protected string _name;' . "\n" .
242 ' protected DateTime _datetimefield;' . "\n" .
243 ' #endregion' . "\n" .
244 ' #region Constructors' . "\n" .
245 ' public Test_table() { }' . "\n" .
246 ' public Test_table(string name, DateTime datetimefield)' . "\n" .
248 ' this._name=name;' . "\n" .
249 ' this._datetimefield=datetimefield;' . "\n" .
251 ' #endregion' . "\n" .
252 ' #region Public Properties' . "\n" .
253 ' public virtual int Id' . "\n" .
255 ' get {return _id;}' . "\n" .
256 ' set {_id=value;}' . "\n" .
258 ' public virtual string Name' . "\n" .
260 ' get {return _name;}' . "\n" .
261 ' set {_name=value;}' . "\n" .
263 ' public virtual DateTime Datetimefield' . "\n" .
265 ' get {return _datetimefield;}' . "\n" .
266 ' set {_datetimefield=value;}' . "\n" .
268 ' #endregion' . "\n" .
270 ' #endregion' . "\n" .
276 public function testHandleNHibernateXMLBody(): void
278 $method = new ReflectionMethod(ExportCodegen
::class, 'handleNHibernateXMLBody');
279 $result = $method->invoke($this->object, 'test_db', 'test_table');
282 '<?xml version="1.0" encoding="utf-8" ?>' . "\n" .
283 '<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Test_db" assembly="Test_db">' . "\n" .
284 ' <class name="Test_table" table="Test_table">' . "\n" .
285 ' <id name="Id" type="Int32" unsaved-value="0">' . "\n" .
286 ' <column name="id" sql-type="int" not-null="true" unique="true" index="PRIMARY"/>' . "\n" .
287 ' <generator class="native" />' . "\n" .
289 ' <property name="Name" type="String">' . "\n" .
290 ' <column name="name" sql-type="varchar" not-null="true" />' . "\n" .
291 ' </property>' . "\n" .
292 ' <property name="Datetimefield" type="DateTime">' . "\n" .
293 ' <column name="datetimefield" sql-type="datetime" not-null="true" />' . "\n" .
294 ' </property>' . "\n" .
296 '</hibernate-mapping>',