Merge pull request #19552 from kamil-tekiela/Fix-default-values
[phpmyadmin.git] / tests / unit / Plugins / Export / ExportCodegenTest.php
blob624021ca04f997825cf39ab855b50dbb4c051a90
1 <?php
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;
21 use ReflectionMethod;
22 use ReflectionProperty;
24 use function ob_get_clean;
25 use function ob_start;
27 #[CoversClass(ExportCodegen::class)]
28 #[Medium]
29 class ExportCodegenTest extends AbstractTestCase
31 protected ExportCodegen $object;
33 /**
34 * Configures global environment.
36 protected function setUp(): void
38 parent::setUp();
40 $dbi = $this->createDatabaseInterface();
41 DatabaseInterface::$instance = $dbi;
42 $this->object = new ExportCodegen(
43 new Relation($dbi),
44 new Export($dbi),
45 new Transformations(),
49 /**
50 * tearDown for test cases
52 protected function tearDown(): void
54 parent::tearDown();
56 unset($this->object);
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);
69 self::assertSame(
70 'CodeGen',
71 $properties->getText(),
74 self::assertSame(
75 'cs',
76 $properties->getExtension(),
79 self::assertSame(
80 'text/cs',
81 $properties->getMimeType(),
84 self::assertSame(
85 'Options',
86 $properties->getOptionsText(),
89 $options = $properties->getOptions();
91 self::assertInstanceOf(OptionsPropertyRootGroup::class, $options);
93 self::assertSame(
94 'Format Specific Options',
95 $options->getName(),
98 $generalOptionsArray = $options->getProperties();
99 $generalOptions = $generalOptionsArray->current();
101 self::assertInstanceOf(OptionsPropertyMainGroup::class, $generalOptions);
103 self::assertSame(
104 'general_opts',
105 $generalOptions->getName(),
108 $generalProperties = $generalOptions->getProperties();
110 $hidden = $generalProperties->current();
111 $generalProperties->next();
113 self::assertInstanceOf(HiddenPropertyItem::class, $hidden);
115 self::assertSame(
116 'structure_or_data',
117 $hidden->getName(),
120 $select = $generalProperties->current();
122 self::assertInstanceOf(SelectPropertyItem::class, $select);
124 self::assertSame(
125 'format',
126 $select->getName(),
129 self::assertSame(
130 'Format:',
131 $select->getText(),
134 self::assertSame(
135 ['NHibernate C# DO', 'NHibernate XML'],
136 $select->getValues(),
140 public function testExportHeader(): void
142 self::assertTrue(
143 $this->object->exportHeader(),
147 public function testExportFooter(): void
149 self::assertTrue(
150 $this->object->exportFooter(),
154 public function testExportDBHeader(): void
156 self::assertTrue(
157 $this->object->exportDBHeader('testDB'),
161 public function testExportDBFooter(): void
163 self::assertTrue(
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, []);
181 ob_start();
182 $this->object->exportData('test_db', 'test_table', 'SELECT * FROM `test_db`.`test_table`;');
183 $result = ob_get_clean();
185 self::assertIsString($result);
186 self::assertSame(
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"
193 . ' </id>' . "\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"
200 . ' </class>' . "\n"
201 . '</hibernate-mapping>',
202 $result,
206 public function testCgMakeIdentifier(): void
208 self::assertSame(
209 '_Ⅲfoo',
210 ExportCodegen::cgMakeIdentifier('Ⅲ{}96`{}foo', true),
213 self::assertSame(
214 'TestⅢ',
215 ExportCodegen::cgMakeIdentifier('`98testⅢ{}96`{}', true),
218 self::assertSame(
219 'testⅢ',
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');
229 self::assertSame(
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" .
235 '{' . "\n" .
236 ' #region Test_table' . "\n" .
237 ' public class Test_table' . "\n" .
238 ' {' . "\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" .
247 ' {' . "\n" .
248 ' this._name=name;' . "\n" .
249 ' this._datetimefield=datetimefield;' . "\n" .
250 ' }' . "\n" .
251 ' #endregion' . "\n" .
252 ' #region Public Properties' . "\n" .
253 ' public virtual int Id' . "\n" .
254 ' {' . "\n" .
255 ' get {return _id;}' . "\n" .
256 ' set {_id=value;}' . "\n" .
257 ' }' . "\n" .
258 ' public virtual string Name' . "\n" .
259 ' {' . "\n" .
260 ' get {return _name;}' . "\n" .
261 ' set {_name=value;}' . "\n" .
262 ' }' . "\n" .
263 ' public virtual DateTime Datetimefield' . "\n" .
264 ' {' . "\n" .
265 ' get {return _datetimefield;}' . "\n" .
266 ' set {_datetimefield=value;}' . "\n" .
267 ' }' . "\n" .
268 ' #endregion' . "\n" .
269 ' }' . "\n" .
270 ' #endregion' . "\n" .
271 '}',
272 $result,
276 public function testHandleNHibernateXMLBody(): void
278 $method = new ReflectionMethod(ExportCodegen::class, 'handleNHibernateXMLBody');
279 $result = $method->invoke($this->object, 'test_db', 'test_table');
281 self::assertSame(
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" .
288 ' </id>' . "\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" .
295 ' </class>' . "\n" .
296 '</hibernate-mapping>',
297 $result,