1
+ /*
2
+ * This file is part of the Symfony package.
3
+ *
4
+ * (c) Fabien Potencier <fabien@symfony.com>
5
+ *
6
+ * For the full copyright and license information, please view the LICENSE
7
+ * file that was distributed with this source code.
8
+ */
9
+
10
+ import { Application } from '@hotwired/stimulus' ;
11
+ import { waitFor } from '@testing-library/dom' ;
12
+ import DataTableController from '../src/controller' ;
13
+
14
+ const startDataTableTest = async ( tableHtml : string ) : Promise < { table : HTMLTableElement ; dataTable : DataTable < any > } > => {
15
+ let dataTable : DataTable < any > | null = null ;
16
+
17
+ document . body . addEventListener ( 'datatables:pre-connect' , ( ) => {
18
+ document . body . classList . add ( 'pre-connected' ) ;
19
+ } ) ;
20
+
21
+ document . body . addEventListener ( 'datatables:connect' , ( event : any ) => {
22
+ dataTable = event . detail . table ;
23
+ document . body . classList . add ( 'connected' ) ;
24
+ } ) ;
25
+
26
+ document . body . innerHTML = tableHtml ;
27
+
28
+ const tableElement = document . querySelector ( 'table' ) ;
29
+ if ( ! tableElement ) {
30
+ throw 'Missing table element' ;
31
+ }
32
+
33
+ await waitFor ( ( ) => {
34
+ expect ( document . body ) . toHaveClass ( 'pre-connected' ) ;
35
+ expect ( document . body ) . toHaveClass ( 'connected' ) ;
36
+ } ) ;
37
+
38
+ if ( ! dataTable ) {
39
+ throw 'Missing DataTable instance' ;
40
+ }
41
+
42
+ return { table : tableElement , dataTable } ;
43
+ } ;
44
+
45
+ describe ( 'DataTableController' , ( ) => {
46
+ beforeAll ( ( ) => {
47
+ const application = Application . start ( ) ;
48
+ application . register ( 'datatables' , DataTableController ) ;
49
+ } ) ;
50
+
51
+ afterEach ( ( ) => {
52
+ document . body . innerHTML = '' ;
53
+ } ) ;
54
+
55
+ it ( 'connect without data' , async ( ) => {
56
+ const { dataTable } = await startDataTableTest ( `
57
+ <table
58
+ data-testid="datatable"
59
+ data-controller="datatables"
60
+ data-datatables-view-value="{"columns": [{"title": "First name"},{"title": "Last name"}]}"
61
+ ></table>
62
+ ` ) ;
63
+
64
+ expect ( dataTable . data ( ) . toArray ( ) ) . toEqual ( [ ] ) ;
65
+ } ) ;
66
+
67
+ it ( 'connect with data' , async ( ) => {
68
+ const { dataTable } = await startDataTableTest ( `
69
+ <table
70
+ data-testid="datatable"
71
+ data-controller="datatables"
72
+ data-datatables-view-value="{"columns": [{"title": "First name"},{"title": "Last name"}], "data": [["John", "Doe"], ["Jane", "Smith"]]}"
73
+ ></table>
74
+ ` ) ;
75
+
76
+ expect ( dataTable . data ( ) . toArray ( ) ) . toEqual ( [
77
+ [ 'John' , 'Doe' ] ,
78
+ [ 'Jane' , 'Smith' ] ,
79
+ ] ) ;
80
+ } ) ;
81
+ } ) ;
0 commit comments