Browse Source

unit tests clean up

tags/3.0.0-alpha1
Paul Klimov 7 years ago
parent
commit
8779f7a187
  1. 12
      tests/data/config.php
  2. 313
      tests/data/mssql.sql
  3. 437
      tests/data/oci.sql
  4. 3
      tests/js/data/yii.activeForm.html
  5. 170
      tests/js/data/yii.gridView.html
  6. 194
      tests/js/data/yii.html
  7. 162
      tests/js/tests/yii.activeForm.test.js
  8. 151
      tests/js/tests/yii.captcha.test.js
  9. 791
      tests/js/tests/yii.gridView.test.js
  10. 1415
      tests/js/tests/yii.test.js
  11. 1667
      tests/js/tests/yii.validation.test.js
  12. 56
      tests/mssql/Dockerfile
  13. 34
      tests/mssql/docker-compose.yml

12
tests/data/config.php

@ -36,24 +36,12 @@ $config = [
'dsn' => 'sqlite::memory:', 'dsn' => 'sqlite::memory:',
'fixture' => __DIR__ . '/sqlite.sql', 'fixture' => __DIR__ . '/sqlite.sql',
], ],
'sqlsrv' => [
'dsn' => 'sqlsrv:Server=localhost;Database=test',
'username' => '',
'password' => '',
'fixture' => __DIR__ . '/mssql.sql',
],
'pgsql' => [ 'pgsql' => [
'dsn' => 'pgsql:host=localhost;dbname=yiitest;port=5432;', 'dsn' => 'pgsql:host=localhost;dbname=yiitest;port=5432;',
'username' => 'postgres', 'username' => 'postgres',
'password' => 'postgres', 'password' => 'postgres',
'fixture' => __DIR__ . '/postgres.sql', 'fixture' => __DIR__ . '/postgres.sql',
], ],
'oci' => [
'dsn' => 'oci:dbname=LOCAL_XE;charset=AL32UTF8;',
'username' => '',
'password' => '',
'fixture' => __DIR__ . '/oci.sql',
],
], ],
]; ];

313
tests/data/mssql.sql

@ -1,313 +0,0 @@
IF OBJECT_ID('[dbo].[order_item]', 'U') IS NOT NULL DROP TABLE [dbo].[order_item];
IF OBJECT_ID('[dbo].[order_item_with_null_fk]', 'U') IS NOT NULL DROP TABLE [dbo].[order_item_with_null_fk];
IF OBJECT_ID('[dbo].[item]', 'U') IS NOT NULL DROP TABLE [dbo].[item];
IF OBJECT_ID('[dbo].[order]', 'U') IS NOT NULL DROP TABLE [dbo].[order];
IF OBJECT_ID('[dbo].[order_with_null_fk]', 'U') IS NOT NULL DROP TABLE [dbo].[order_with_null_fk];
IF OBJECT_ID('[dbo].[category]', 'U') IS NOT NULL DROP TABLE [dbo].[category];
IF OBJECT_ID('[dbo].[customer]', 'U') IS NOT NULL DROP TABLE [dbo].[customer];
IF OBJECT_ID('[dbo].[profile]', 'U') IS NOT NULL DROP TABLE [dbo].[profile];
IF OBJECT_ID('[dbo].[type]', 'U') IS NOT NULL DROP TABLE [dbo].[type];
IF OBJECT_ID('[dbo].[null_values]', 'U') IS NOT NULL DROP TABLE [dbo].[null_values];
IF OBJECT_ID('[dbo].[negative_default_values]', 'U') IS NOT NULL DROP TABLE [dbo].[negative_default_values];
IF OBJECT_ID('[dbo].[animal]', 'U') IS NOT NULL DROP TABLE [dbo].[animal];
IF OBJECT_ID('[dbo].[default_pk]', 'U') IS NOT NULL DROP TABLE [dbo].[default_pk];
IF OBJECT_ID('[dbo].[document]', 'U') IS NOT NULL DROP TABLE [dbo].[document];
IF OBJECT_ID('[dbo].[dossier]', 'U') IS NOT NULL DROP TABLE [dbo].[dossier];
IF OBJECT_ID('[dbo].[employee]', 'U') IS NOT NULL DROP TABLE [dbo].[employee];
IF OBJECT_ID('[dbo].[department]', 'U') IS NOT NULL DROP TABLE [dbo].[department];
IF OBJECT_ID('[dbo].[animal_view]', 'V') IS NOT NULL DROP VIEW [dbo].[animal_view];
IF OBJECT_ID('[T_constraints_4]', 'U') IS NOT NULL DROP TABLE [T_constraints_4];
IF OBJECT_ID('[T_constraints_3]', 'U') IS NOT NULL DROP TABLE [T_constraints_3];
IF OBJECT_ID('[T_constraints_2]', 'U') IS NOT NULL DROP TABLE [T_constraints_2];
IF OBJECT_ID('[T_constraints_1]', 'U') IS NOT NULL DROP TABLE [T_constraints_1];
IF OBJECT_ID('[T_upsert]', 'U') IS NOT NULL DROP TABLE [T_upsert];
CREATE TABLE [dbo].[profile] (
[id] [int] IDENTITY NOT NULL,
[description] [varchar](128) NOT NULL,
CONSTRAINT [PK_profile] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[customer] (
[id] [int] IDENTITY NOT NULL,
[email] [varchar](128) NOT NULL,
[name] [varchar](128),
[address] [text],
[status] [int] DEFAULT 0,
[profile_id] [int],
CONSTRAINT [PK_customer] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[category] (
[id] [int] IDENTITY NOT NULL,
[name] [varchar](128) NOT NULL,
CONSTRAINT [PK_category] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[item] (
[id] [int] IDENTITY NOT NULL,
[name] [varchar](128) NOT NULL,
[category_id] [int] NOT NULL,
CONSTRAINT [PK_item] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[order] (
[id] [int] IDENTITY NOT NULL,
[customer_id] [int] NOT NULL,
[created_at] [int] NOT NULL,
[total] [decimal](10,0) NOT NULL,
CONSTRAINT [PK_order] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[order_with_null_fk] (
[id] [int] IDENTITY NOT NULL,
[customer_id] [int] ,
[created_at] [int] NOT NULL,
[total] [decimal](10,0) NOT NULL,
CONSTRAINT [PK_order_with_null_fk] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[order_item] (
[order_id] [int] NOT NULL,
[item_id] [int] NOT NULL,
[quantity] [int] NOT NULL,
[subtotal] [decimal](10,0) NOT NULL,
CONSTRAINT [PK_order_item] PRIMARY KEY CLUSTERED (
[order_id] ASC,
[item_id] ASC
) ON [PRIMARY]
);CREATE TABLE [dbo].[order_item_with_null_fk] (
[order_id] [int],
[item_id] [int],
[quantity] [int] NOT NULL,
[subtotal] [decimal](10,0) NOT NULL
);
CREATE TABLE [dbo].[null_values] (
[id] [int] IDENTITY NOT NULL,
var1 [int] NULL,
var2 [int] NULL,
var3 [int] DEFAULT NULL,
stringcol [varchar](32) DEFAULT NULL,
PRIMARY KEY (id)
);
CREATE TABLE [dbo].[negative_default_values] (
[tinyint_col] [tinyint] DEFAULT '-123',
[smallint_col] [tinyint] DEFAULT '-123',
[int_col] [smallint] DEFAULT '-123',
[bigint_col] [int] DEFAULT '-123',
[float_col] [float] DEFAULT '-12345.6789',
[numeric_col] [decimal](5,2) DEFAULT '-33.22'
);
CREATE TABLE [dbo].[type] (
[int_col] [int] NOT NULL,
[int_col2] [int] DEFAULT '1',
[tinyint_col] [tinyint] DEFAULT '1',
[smallint_col] [smallint] DEFAULT '1',
[char_col] [char](100) NOT NULL,
[char_col2] [varchar](100) DEFAULT 'something',
[char_col3] [text],
[float_col] [decimal](4,3) NOT NULL,
[float_col2] [float] DEFAULT '1.23',
[blob_col] [varbinary](MAX),
[numeric_col] [decimal](5,2) DEFAULT '33.22',
[time] [datetime] NOT NULL DEFAULT '2002-01-01 00:00:00',
[bool_col] [tinyint] NOT NULL,
[bool_col2] [tinyint] DEFAULT '1'
);
CREATE TABLE [dbo].[animal] (
[id] [int] IDENTITY NOT NULL,
[type] [varchar](255) NOT NULL,
CONSTRAINT [PK_animal] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[default_pk] (
[id] [int] NOT NULL DEFAULT 5,
[type] [varchar](255) NOT NULL,
CONSTRAINT [PK_default_pk] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[document] (
[id] [int] IDENTITY NOT NULL,
[title] [varchar](255) NOT NULL,
[content] [text],
[version] [int] NOT NULL DEFAULT 0,
CONSTRAINT [PK_document_pk] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[department] (
[id] [int] IDENTITY NOT NULL,
[title] [varchar](255) NOT NULL,
CONSTRAINT [PK_department_pk] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[employee] (
[id] [int] NOT NULL,
[department_id] [int] NOT NULL,
[first_name] [varchar](255) NOT NULL,
[last_name] [varchar](255) NOT NULL,
CONSTRAINT [PK_employee_pk] PRIMARY KEY CLUSTERED (
[id] ASC,
[department_id] ASC
) ON [PRIMARY]
);
CREATE TABLE [dbo].[dossier] (
[id] [int] IDENTITY NOT NULL,
[department_id] [int] NOT NULL,
[employee_id] [int] NOT NULL,
[summary] [varchar](255) NOT NULL,
CONSTRAINT [PK_dossier_pk] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
CREATE VIEW [dbo].[animal_view] AS SELECT * FROM [dbo].[animal];
INSERT INTO [dbo].[animal] (type) VALUES ('yiiunit\data\ar\Cat');
INSERT INTO [dbo].[animal] (type) VALUES ('yiiunit\data\ar\Dog');
INSERT INTO [dbo].[profile] ([description]) VALUES ('profile customer 1');
INSERT INTO [dbo].[profile] ([description]) VALUES ('profile customer 3');
INSERT INTO [dbo].[customer] ([email], [name], [address], [status], [profile_id]) VALUES ('user1@example.com', 'user1', 'address1', 1, 1);
INSERT INTO [dbo].[customer] ([email], [name], [address], [status]) VALUES ('user2@example.com', 'user2', 'address2', 1);
INSERT INTO [dbo].[customer] ([email], [name], [address], [status], [profile_id]) VALUES ('user3@example.com', 'user3', 'address3', 2, 2);
INSERT INTO [dbo].[category] ([name]) VALUES ('Books');
INSERT INTO [dbo].[category] ([name]) VALUES ('Movies');
INSERT INTO [dbo].[item] ([name], [category_id]) VALUES ('Agile Web Application Development with Yii1.1 and PHP5', 1);
INSERT INTO [dbo].[item] ([name], [category_id]) VALUES ('Yii 1.1 Application Development Cookbook', 1);
INSERT INTO [dbo].[item] ([name], [category_id]) VALUES ('Ice Age', 2);
INSERT INTO [dbo].[item] ([name], [category_id]) VALUES ('Toy Story', 2);
INSERT INTO [dbo].[item] ([name], [category_id]) VALUES ('Cars', 2);
INSERT INTO [dbo].[order] ([customer_id], [created_at], [total]) VALUES (1, 1325282384, 110.0);
INSERT INTO [dbo].[order] ([customer_id], [created_at], [total]) VALUES (2, 1325334482, 33.0);
INSERT INTO [dbo].[order] ([customer_id], [created_at], [total]) VALUES (2, 1325502201, 40.0);
INSERT INTO [dbo].[order_with_null_fk] ([customer_id], [created_at], [total]) VALUES (1, 1325282384, 110.0);
INSERT INTO [dbo].[order_with_null_fk] ([customer_id], [created_at], [total]) VALUES (2, 1325334482, 33.0);
INSERT INTO [dbo].[order_with_null_fk] ([customer_id], [created_at], [total]) VALUES (2, 1325502201, 40.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (1, 1, 1, 30.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (1, 2, 2, 40.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 4, 1, 10.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 5, 1, 15.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 3, 1, 8.0);
INSERT INTO [dbo].[order_item] ([order_id], [item_id], [quantity], [subtotal]) VALUES (3, 2, 1, 40.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (1, 1, 1, 30.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (1, 2, 2, 40.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 4, 1, 10.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 5, 1, 15.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (2, 3, 1, 8.0);
INSERT INTO [dbo].[order_item_with_null_fk] ([order_id], [item_id], [quantity], [subtotal]) VALUES (3, 2, 1, 40.0);
INSERT INTO [dbo].[document] ([title], [content], [version]) VALUES ('Yii 2.0 guide', 'This is Yii 2.0 guide', 0);
SET IDENTITY_INSERT [dbo].[department] ON;
INSERT INTO [dbo].[department] (id, title) VALUES (1, 'IT');
INSERT INTO [dbo].[department] (id, title) VALUES (2, 'accounting');
SET IDENTITY_INSERT [dbo].[department] OFF;
INSERT INTO [dbo].[employee] (id, department_id, first_name, last_name) VALUES (1, 1, 'John', 'Doe');
INSERT INTO [dbo].[employee] (id, department_id, first_name, last_name) VALUES (1, 2, 'Ann', 'Smith');
INSERT INTO [dbo].[employee] (id, department_id, first_name, last_name) VALUES (2, 2, 'Will', 'Smith');
SET IDENTITY_INSERT [dbo].[dossier] ON;
INSERT INTO [dbo].[dossier] (id, department_id, employee_id, summary) VALUES (1, 1, 1, 'Excellent employee.');
INSERT INTO [dbo].[dossier] (id, department_id, employee_id, summary) VALUES (2, 2, 1, 'Brilliant employee.');
INSERT INTO [dbo].[dossier] (id, department_id, employee_id, summary) VALUES (3, 2, 2, 'Good employee.');
SET IDENTITY_INSERT [dbo].[dossier] OFF;
/* bit test, see https://github.com/yiisoft/yii2/issues/9006 */
IF OBJECT_ID('[dbo].[bit_values]', 'U') IS NOT NULL DROP TABLE [dbo].[bit_values];
CREATE TABLE [dbo].[bit_values] (
[id] [int] IDENTITY NOT NULL,
[val] [bit] NOT NULL,
CONSTRAINT [PK_bit_values] PRIMARY KEY CLUSTERED (
[id] ASC
) ON [PRIMARY]
);
INSERT INTO [dbo].[bit_values] ([val]) VALUES (0), (1);
CREATE TABLE [T_constraints_1]
(
[C_id] INT NOT NULL IDENTITY PRIMARY KEY,
[C_not_null] INT NOT NULL,
[C_check] VARCHAR(255) NULL CHECK ([C_check] <> ''),
[C_unique] INT NOT NULL,
[C_default] INT NOT NULL DEFAULT 0,
CONSTRAINT [CN_unique] UNIQUE ([C_unique])
);
CREATE TABLE [T_constraints_2]
(
[C_id_1] INT NOT NULL,
[C_id_2] INT NOT NULL,
[C_index_1] INT NULL,
[C_index_2_1] INT NULL,
[C_index_2_2] INT NULL,
CONSTRAINT [CN_constraints_2_multi] UNIQUE ([C_index_2_1], [C_index_2_2]),
CONSTRAINT [CN_pk] PRIMARY KEY ([C_id_1], [C_id_2])
);
CREATE INDEX [CN_constraints_2_single] ON [T_constraints_2] ([C_index_1]);
CREATE TABLE [T_constraints_3]
(
[C_id] INT NOT NULL,
[C_fk_id_1] INT NOT NULL,
[C_fk_id_2] INT NOT NULL,
CONSTRAINT [CN_constraints_3] FOREIGN KEY ([C_fk_id_1], [C_fk_id_2]) REFERENCES [T_constraints_2] ([C_id_1], [C_id_2]) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE [T_constraints_4]
(
[C_id] INT NOT NULL IDENTITY PRIMARY KEY,
[C_col_1] INT NULL,
[C_col_2] INT NOT NULL,
CONSTRAINT [CN_constraints_4] UNIQUE ([C_col_1], [C_col_2])
);
CREATE TABLE [T_upsert]
(
[id] INT NOT NULL IDENTITY PRIMARY KEY,
[ts] INT NULL,
[email] VARCHAR(128) NOT NULL UNIQUE,
[recovery_email] VARCHAR(128) NULL,
[address] TEXT NULL,
[status] TINYINT NOT NULL DEFAULT 0,
[orders] INT NOT NULL DEFAULT 0,
[profile_id] INT NULL,
UNIQUE ([email], [recovery_email])
);

437
tests/data/oci.sql

@ -1,437 +0,0 @@
/**
* This is the database schema for testing Oracle support of Yii Active Record.
*/
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "composite_fk"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "order_item"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "item"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "order_item_with_null_fk"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "order"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "order_with_null_fk"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "category"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "customer"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "profile"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "type"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "null_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "negative_default_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "constraints"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "bool_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "animal"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "default_pk"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "document"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "dossier"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "employee"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "department"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP VIEW "animal_view"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "validator_main"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "validator_ref"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "bit_values"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END; --
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "T_constraints_4"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "T_constraints_3"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "T_constraints_2"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "T_constraints_1"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP TABLE "T_upsert"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "profile_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "customer_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "category_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "item_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "order_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "order_with_null_fk_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "null_values_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "bool_values_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "animal_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "document_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "T_upsert_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "department_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE "employee_SEQ"'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -2289 THEN RAISE; END IF; END;--
/* STATEMENTS */
CREATE TABLE "constraints"
(
"id" integer not null,
"field1" varchar2(255)
);
CREATE TABLE "profile" (
"id" integer not null,
"description" varchar2(128) NOT NULL,
CONSTRAINT "profile_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "profile_SEQ";
CREATE TABLE "customer" (
"id" integer not null,
"email" varchar2(128) NOT NULL UNIQUE,
"name" varchar2(128),
"address" varchar(4000),
"status" integer DEFAULT 0,
"bool_status" char DEFAULT 0 check ("bool_status" in (0,1)),
"profile_id" integer,
CONSTRAINT "customer_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "customer_SEQ";
comment on column "customer"."email" is 'someone@example.com';
CREATE TABLE "category" (
"id" integer not null,
"name" varchar2(128) NOT NULL,
CONSTRAINT "category_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "category_SEQ";
CREATE TABLE "item" (
"id" integer not null,
"name" varchar2(128) NOT NULL,
"category_id" integer NOT NULL references "category"("id") on DELETE CASCADE,
CONSTRAINT "item_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "item_SEQ";
CREATE TABLE "order" (
"id" integer not null,
"customer_id" integer NOT NULL references "customer"("id") on DELETE CASCADE,
"created_at" integer NOT NULL,
"total" decimal(10,0) NOT NULL,
CONSTRAINT "order_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "order_SEQ";
CREATE TABLE "order_with_null_fk" (
"id" integer not null,
"customer_id" integer,
"created_at" integer NOT NULL,
"total" decimal(10,0) NOT NULL,
CONSTRAINT "order_with_null_fk_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "order_with_null_fk_SEQ";
CREATE TABLE "order_item" (
"order_id" integer NOT NULL references "order"("id") on DELETE CASCADE,
"item_id" integer NOT NULL references "item"("id") on DELETE CASCADE,
"quantity" integer NOT NULL,
"subtotal" decimal(10,0) NOT NULL,
CONSTRAINT "order_item_PK" PRIMARY KEY ("order_id", "item_id") ENABLE
);
CREATE TABLE "order_item_with_null_fk" (
"order_id" integer,
"item_id" integer,
"quantity" integer NOT NULL,
"subtotal" decimal(10,0) NOT NULL
);
CREATE TABLE "composite_fk" (
"id" integer NOT NULL,
"order_id" integer NOT NULL,
"item_id" integer NOT NULL,
CONSTRAINT "composite_fk_PK" PRIMARY KEY ("id") ENABLE,
CONSTRAINT FK_composite_fk_order_item FOREIGN KEY ("order_id", "item_id")
REFERENCES "order_item" ("order_id", "item_id") ON DELETE CASCADE
);
CREATE TABLE "null_values" (
"id" INT NOT NULL,
"var1" INT NULL,
"var2" INT NULL,
"var3" INT DEFAULT NULL,
"stringcol" varchar2(32) DEFAULT NULL,
CONSTRAINT "null_values_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "null_values_SEQ";
CREATE TABLE "negative_default_values" (
"tinyint_col" number(3) default -123,
"smallint_col" smallint default -123,
"int_col" integer default -123,
"bigint_col" integer default -123,
"float_col" double precision default -12345.6789,
"numeric_col" decimal(5,2) default -33.22
);
CREATE TABLE "type" (
"int_col" integer NOT NULL,
"int_col2" integer DEFAULT 1,
"tinyint_col" number(3) DEFAULT 1,
"smallint_col" smallint DEFAULT 1,
"char_col" char(100) NOT NULL,
"char_col2" varchar2(100) DEFAULT 'something',
"char_col3" varchar2(4000),
"float_col" double precision NOT NULL,
"float_col2" double precision DEFAULT 1.23,
"blob_col" blob,
"numeric_col" decimal(5,2) DEFAULT 33.22,
"time" timestamp DEFAULT to_timestamp('2002-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') NOT NULL,
"bool_col" char NOT NULL check ("bool_col" in (0,1)),
"bool_col2" char DEFAULT 1 check("bool_col2" in (0,1)),
"ts_default" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
"bit_col" char(3) DEFAULT 130 NOT NULL
);
CREATE TABLE "bool_values" (
"id" integer not null,
"bool_col" char check ("bool_col" in (0,1)),
"default_true" char default 1 not null check ("default_true" in (0,1)),
"default_false" char default 0 not null check ("default_false" in (0,1)),
CONSTRAINT "bool_values_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "bool_values_SEQ";
CREATE TABLE "animal" (
"id" integer,
"type" varchar2(255) not null,
CONSTRAINT "animal_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "animal_SEQ";
CREATE TABLE "default_pk" (
"id" integer default 5 not null,
"type" varchar2(255) not null,
CONSTRAINT "default_pk_PK" PRIMARY KEY ("id") ENABLE
);
CREATE TABLE "document" (
"id" integer,
"title" varchar2(255) not null,
"content" varchar(4000),
"version" integer default 0 not null,
CONSTRAINT "document_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "document_SEQ";
CREATE TABLE "department" (
"id" INTEGER NOT NULL,
"title" varchar2(255) not null,
CONSTRAINT "department_PK" PRIMARY KEY ("id") ENABLE
);
CREATE SEQUENCE "department_SEQ";
CREATE TABLE "employee" (
"id" INTEGER NOT NULL,
"department_id" INTEGER NOT NULL,
"first_name" varchar2(255) not null,
"last_name" varchar2(255) not null,
CONSTRAINT "employee_PK" PRIMARY KEY ("id", "department_id") ENABLE
);
CREATE SEQUENCE "employee_SEQ";
CREATE TABLE "dossier" (
"id" INTEGER NOT NULL,
"department_id" INTEGER NOT NULL,
"employee_id" INTEGER NOT NULL,
"summary" varchar2(255) not null,
CONSTRAINT "dossier_PK" PRIMARY KEY ("id", "department_id") ENABLE
);
CREATE VIEW "animal_view" AS SELECT * FROM "animal";
CREATE TABLE "bit_values" (
"id" integer not null,
"val" char(1) NOT NULL,
CONSTRAINT "bit_values_PK" PRIMARY KEY ("id") ENABLE,
CONSTRAINT "bit_values_val" CHECK ("val" IN ('1','0'))
);
CREATE TABLE "T_constraints_1"
(
"C_id" INT NOT NULL PRIMARY KEY,
"C_not_null" INT NOT NULL,
"C_check" VARCHAR(255) NULL CHECK ("C_check" <> ''),
"C_unique" INT NOT NULL,
"C_default" INT DEFAULT 0 NOT NULL,
CONSTRAINT "CN_unique" UNIQUE ("C_unique")
);
CREATE TABLE "T_constraints_2"
(
"C_id_1" INT NOT NULL,
"C_id_2" INT NOT NULL,
"C_index_1" INT NULL,
"C_index_2_1" INT NULL,
"C_index_2_2" INT NULL,
CONSTRAINT "CN_constraints_2_multi" UNIQUE ("C_index_2_1", "C_index_2_2"),
CONSTRAINT "CN_pk" PRIMARY KEY ("C_id_1", "C_id_2")
);
CREATE INDEX "CN_constraints_2_single" ON "T_constraints_2" ("C_index_1");
CREATE TABLE "T_constraints_3"
(
"C_id" INT NOT NULL,
"C_fk_id_1" INT NOT NULL,
"C_fk_id_2" INT NOT NULL,
CONSTRAINT "CN_constraints_3" FOREIGN KEY ("C_fk_id_1", "C_fk_id_2") REFERENCES "T_constraints_2" ("C_id_1", "C_id_2") ON DELETE CASCADE
);
CREATE TABLE "T_constraints_4"
(
"C_id" INT NOT NULL PRIMARY KEY,
"C_col_1" INT NULL,
"C_col_2" INT NOT NULL,
CONSTRAINT "CN_constraints_4" UNIQUE ("C_col_1", "C_col_2")
);
CREATE TABLE "T_upsert"
(
"id" INT NOT NULL PRIMARY KEY,
"ts" INT NULL,
"email" VARCHAR(128) NOT NULL UNIQUE,
"recovery_email" VARCHAR(128) NULL,
"address" CLOB NULL,
"status" NUMBER(5,0) DEFAULT 0 NOT NULL,
"orders" INT DEFAULT 0 NOT NULL,
"profile_id" INT NULL,
CONSTRAINT "CN_T_upsert_multi" UNIQUE ("email", "recovery_email")
);
CREATE SEQUENCE "T_upsert_SEQ";
/**
* (Postgres-)Database Schema for validator tests
*/
CREATE TABLE "validator_main" (
"id" integer not null,
"field1" varchar2(255),
CONSTRAINT "validator_main_PK" PRIMARY KEY ("id") ENABLE
);
CREATE TABLE "validator_ref" (
"id" integer not null,
"a_field" varchar2(255),
"ref" integer,
CONSTRAINT "validator_ref_PK" PRIMARY KEY ("id") ENABLE
);
/* TRIGGERS */
CREATE TRIGGER "profile_TRG" BEFORE INSERT ON "profile" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "profile_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "customer_TRG" BEFORE INSERT ON "customer" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "customer_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "category_TRG" BEFORE INSERT ON "category" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "category_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "item_TRG" BEFORE INSERT ON "item" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "item_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "order_TRG" BEFORE INSERT ON "order" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "order_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "order_with_null_fk_TRG" BEFORE INSERT ON "order_with_null_fk" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "order_with_null_fk_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "null_values_TRG" BEFORE INSERT ON "null_values" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "null_values_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "bool_values_TRG" BEFORE INSERT ON "bool_values" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "bool_values_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "animal_TRG" BEFORE INSERT ON "animal" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "animal_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "document_TRG" BEFORE INSERT ON "document" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "document_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
CREATE TRIGGER "T_upsert_TRG" BEFORE INSERT ON "T_upsert" FOR EACH ROW BEGIN <<COLUMN_SEQUENCES>> BEGIN
IF INSERTING AND :NEW."id" IS NULL THEN SELECT "T_upsert_SEQ".NEXTVAL INTO :NEW."id" FROM SYS.DUAL; END IF;
END COLUMN_SEQUENCES;
END;
/
/* TRIGGERS */
INSERT INTO "animal" ("type") VALUES ('yiiunit\data\ar\Cat');
INSERT INTO "animal" ("type") VALUES ('yiiunit\data\ar\Dog');
INSERT INTO "profile" ("description") VALUES ('profile customer 1');
INSERT INTO "profile" ("description") VALUES ('profile customer 3');
INSERT INTO "customer" ("email", "name", "address", "status", "bool_status", "profile_id") VALUES ('user1@example.com', 'user1', 'address1', 1, 1, 1);
INSERT INTO "customer" ("email", "name", "address", "status", "bool_status") VALUES ('user2@example.com', 'user2', 'address2', 1, 1);
INSERT INTO "customer" ("email", "name", "address", "status", "bool_status", "profile_id") VALUES ('user3@example.com', 'user3', 'address3', 2, 0, 2);
INSERT INTO "category" ("name") VALUES ('Books');
INSERT INTO "category" ("name") VALUES ('Movies');
INSERT INTO "item" ("name", "category_id") VALUES ('Agile Web Application Development with Yii1.1 and PHP5', 1);
INSERT INTO "item" ("name", "category_id") VALUES ('Yii 1.1 Application Development Cookbook', 1);
INSERT INTO "item" ("name", "category_id") VALUES ('Ice Age', 2);
INSERT INTO "item" ("name", "category_id") VALUES ('Toy Story', 2);
INSERT INTO "item" ("name", "category_id") VALUES ('Cars', 2);
INSERT INTO "order" ("customer_id", "created_at", "total") VALUES (1, 1325282384, 110.0);
INSERT INTO "order" ("customer_id", "created_at", "total") VALUES (2, 1325334482, 33.0);
INSERT INTO "order" ("customer_id", "created_at", "total") VALUES (2, 1325502201, 40.0);
INSERT INTO "order_with_null_fk" ("customer_id", "created_at", "total") VALUES (1, 1325282384, 110.0);
INSERT INTO "order_with_null_fk" ("customer_id", "created_at", "total") VALUES (2, 1325334482, 33.0);
INSERT INTO "order_with_null_fk" ("customer_id", "created_at", "total") VALUES (2, 1325502201, 40.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (1, 1, 1, 30.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (1, 2, 2, 40.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 4, 1, 10.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 5, 1, 15.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 3, 1, 8.0);
INSERT INTO "order_item" ("order_id", "item_id", "quantity", "subtotal") VALUES (3, 2, 1, 40.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (1, 1, 1, 30.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (1, 2, 2, 40.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 4, 1, 10.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 5, 1, 15.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (2, 3, 1, 8.0);
INSERT INTO "order_item_with_null_fk" ("order_id", "item_id", "quantity", "subtotal") VALUES (3, 2, 1, 40.0);
INSERT INTO "document" ("title", "content", "version") VALUES ('Yii 2.0 guide', 'This is Yii 2.0 guide', 0);
INSERT INTO "department" ("id", "title") VALUES (1, 'IT');
INSERT INTO "department" ("id", "title") VALUES (2, 'accounting');
INSERT INTO "employee" ("id", "department_id", "first_name", "last_name") VALUES (1, 1, 'John', 'Doe');
INSERT INTO "employee" ("id", "department_id", "first_name", "last_name") VALUES (1, 2, 'Ann', 'Smith');
INSERT INTO "employee" ("id", "department_id", "first_name", "last_name") VALUES (2, 2, 'Will', 'Smith');
INSERT INTO "dossier" ("id", "department_id", "employee_id", "summary") VALUES (1, 1, 1, 'Excellent employee.');
INSERT INTO "dossier" ("id", "department_id", "employee_id", "summary") VALUES (2, 2, 1, 'Brilliant employee.');
INSERT INTO "dossier" ("id", "department_id", "employee_id", "summary") VALUES (3, 2, 2, 'Good employee.');
INSERT INTO "validator_main" ("id", "field1") VALUES (1, 'just a string1');
INSERT INTO "validator_main" ("id", "field1") VALUES (2, 'just a string2');
INSERT INTO "validator_main" ("id", "field1") VALUES (3, 'just a string3');
INSERT INTO "validator_main" ("id", "field1") VALUES (4, 'just a string4');
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (1, 'ref_to_2', 2);
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (2, 'ref_to_2', 2);
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (3, 'ref_to_3', 3);
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (4, 'ref_to_4', 4);
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (5, 'ref_to_4', 4);
INSERT INTO "validator_ref" ("id", "a_field", "ref") VALUES (6, 'ref_to_5', 5);
INSERT INTO "bit_values" ("id", "val")
SELECT 1, '0' FROM SYS.DUAL
UNION ALL SELECT 2, '1' FROM SYS.DUAL;

3
tests/js/data/yii.activeForm.html

@ -1,3 +0,0 @@
<form id="w0">
<input id="name" type="text" name="name" value="">
</form>

170
tests/js/data/yii.gridView.html

@ -1,170 +0,0 @@
<!-- Filters for testing of multiple grid views -->
<div id="w-common-filters">
<input name="PostSearch[id]" type="text">
<input name="PostSearch[name]" type="text">
</div>
<!-- The main setup -->
<div id="w0" class="grid-view">
<table>
<thead>
<tr>
<th><input id="w0-check-all" name="selection_all" value="1" type="checkbox"></th>
<th>Name</th>
<th>Category</th>
<th>Tags</th>
</tr>
<tr id="w0-filters">
<td>&nbsp;</td>
<td><input id="w0-name" name="PostSearch[name]" type="text"></td>
<td>
<select id="w0-category" name="PostSearch[category_id]">
<option value="" selected>None</option>
<option value="1">Programming</option>
<option value="2">Traveling</option>
</select>
</td>
<td>
<select id="w0-tags" name="PostSearch[tags][]" multiple>
<option value="1">html</option>
<option value="2">css</option>
<option value="3">js</option>
<option value="4">php</option>
</select>
</td>
</tr>
</thead>
<tbody>
<tr data-key="1">
<td><input class="w0-check-row" name="selection[]" value="1" type="checkbox"></td>
<td>Name 1</td>
<td>Programming</td>
<td>html, css</td>
</tr>
<tr data-key="2">
<td><input class="w0-check-row" name="selection[]" value="2" type="checkbox"></td>
<td>Name 2</td>
<td>Programming</td>
<td>js</td>
</tr>
<tr data-key="3">
<td><input class="w0-check-row" name="selection[]" value="3" type="checkbox"></td>
<td>Name 3</td>
<td>Programming</td>
<td>php</td>
</tr>
</tbody>
</table>
</div>
<!-- The basic setup, used for testing of multiple grid views -->
<div id="w1" class="grid-view">
<table>
<thead>
<tr>
<th><input name="selection_all" value="1" type="checkbox"></th>
<th>ID</th>
<th>Name</th>
</tr>
<tr id="w1-filters">
<td>&nbsp;</td>
<td><input name="PostSearch[id]" type="text"></td>
<td><input name="PostSearch[name]" type="text"></td>
</tr>
</thead>
<tbody>
<tr data-key="1">
<td><input name="selection[]" value="1" type="checkbox"></td>
<td>1</td>
<td>Name 1</td>
</tr>
<tr data-key="2">
<td><input name="selection[]" value="2" type="checkbox"></td>
<td>2</td>
<td>Name 2</td>
</tr>
</tbody>
</table>
</div>
<!-- https://github.com/yiisoft/yii2/pull/10284 -->
<div id="w2">
<table>
<thead>
<tr>
<th>Name</th>
<th>Tags</th>
</tr>
<tr id="w2-filters">
<td><input name="PostSearch[name]" type="text"></td>
<td>
<input type="hidden" name="PostSearch[tags]" value="-1">
<select id="w2-tags" name="PostSearch[tags][]" multiple>
<option value="1">html</option>
<option value="2">css</option>
<option value="3">js</option>
<option value="4">php</option>
</select>
</td>
</tr>
</thead>
<tbody>
<tr data-key="1">
<td>Name 1</td>
<td>html, css</td>
</tr>
<tr data-key="2">
<td>Name 2</td>
<td>js</td>
</tr>
<tr data-key="3">
<td>Name 3</td>
<td>php</td>
</tr>
</tbody>
</table>
</div>
<!-- Setup for testing that event handlers are correctly removed with new selectors -->
<div id="w3">
<table>
<thead>
<tr>
<th>
<input name="selection_all" value="1" type="checkbox">
<input name="selection_all2" value="1" type="checkbox">
</th>
<th>ID</th>
<th>Name</th>
</tr>
<tr id="w3-filters">
<td>&nbsp;</td>
<td><input name="PostSearch[id]" type="text"></td>
<td><input name="PostSearch[name]" type="text"></td>
</tr>
</thead>
<tbody>
<tr data-key="1">
<td>
<input class="w3-check-row" name="selection[]" value="1" type="checkbox">
<input name="selection2[]" value="1" type="checkbox">
</td>
<td>1</td>
<td>Name 1</td>
</tr>
<tr data-key="2">
<td>
<input class="w3-check-row" name="selection[]" value="2" type="checkbox">
<input name="selection2[]" value="2" type="checkbox">
</td>
<td>2</td>
<td>Name 2</td>
</tr>
</tbody>
</table>
</div>

194
tests/js/data/yii.html

@ -1,194 +0,0 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="csrf-param" content="_csrf">
<meta name="csrf-token" content="foobar">
</head>
<body id="body">
<div class="csrf">
<form id="form1">
<input name="_csrf" value="" type="hidden">
</form>
<form id="form2">
<input name="_csrf" value="" type="hidden">
</form>
</div>
<div class="handle-action">
<!-- The rest of pjax related attributes are set using JS to prevent copy pasting and for better readability -->
<div class="no-method">
<div class="invalid">
<div class="no-form">
<a class="link-no-href"></a>
<a class="link-empty-href" href=""></a>
<a class="link-anchor-href" href="#"></a>
<a class="link-no-href-pjax" data-pjax></a>
<a class="link-empty-href-pjax" href="" data-pjax></a>
<a class="link-anchor-href-pjax" href="#" data-pjax></a>
<input class="not-submit-no-form" type="text">
<input class="submit-no-form" type="submit">
<button class="submit-form-not-exist" data-form="not-existing-form"></button>
<input class="not-submit-no-form-pjax" type="text" data-pjax>
<input class="submit-no-form-pjax" type="submit" data-pjax>
<button class="submit-form-not-exist-pjax" data-form="not-existing-form" data-pjax></button>
</div>
<div class="form">
<form id="not-submit-separate-form">
<input name="query" value="a">
</form>
<button class="not-submit-outside-form" type="button" data-form="not-submit-separate-form"></button>
<form id="not-submit-parent-form">
<input class="not-submit-inside-form" type="reset">
</form>
<button class="not-submit-outside-form-pjax"
type="button"
data-form="not-submit-separate-form"
data-pjax></button>
<form id="not-submit-parent-form-pjax">
<input class="not-submit-inside-form-pjax" type="reset" data-pjax>
</form>
</div>
</div>
<div class="valid">
<a class="link" href="/tests/index"></a>
<a class="link-pjax-0" href="/tests/index" data-pjax="0"></a>
<a class="link-pjax" href="/tests/index" data-pjax></a>
<a class="link-pjax-1" href="/tests/index" data-pjax="1"></a>
<a class="link-pjax-true" href="/tests/index" data-pjax="true"></a>
<div id="pjax-separate-container"></div>
<a class="link-pjax-outside-container"
href="/tests/index"
data-pjax
data-pjax-container="#pjax-separate-container"></a>
<div id="pjax-container-1" data-pjax-container>
<div id="pjax-container-2" data-pjax-container>
<a class="link-pjax-inside-container" href="/tests/index" data-pjax></a>
</div>
</div>
<form id="submit-separate-form">
<input name="query" value="a">
</form>
<input class="submit-outside-form" type="submit" data-form="submit-separate-form">
<form id="submit-parent-form">
<button class="submit-inside-form"></button>
</form>
<input class="submit-outside-form-pjax" type="submit" data-form="submit-separate-form" data-pjax>
<form id="submit-parent-form-pjax">
<button class="submit-inside-form-pjax" data-pjax></button>
</form>
</div>
</div>
<div class="method">
<div class="no-form">
<a class="bad-href" href="#" data-method="get"></a>
<a class="bad-params" href="/tests/index" data-method="get" data-params="{'foo':'1','bar':'2'}"></a>
<a class="get-params-target"
href="/tests/index"
target="_blank"
data-method="get"
data-params='{"foo":"1","bar":"2"}'></a>
<a class="head" href="/tests/index" data-method="head" data-params='{"foo":"1","bar":"2"}'></a>
<a class="post" href="/tests/index" data-method="post" data-params='{"foo":"1","bar":"2"}'></a>
<a class="post-upper-case" href="/tests/index" data-method="POST" data-params='{"foo":"1","bar":"2"}'></a>
<a class="put" href="/tests/index" data-method="put" data-params='{"foo":"1","bar":"2"}'></a>
<a class="get-params-pjax"
href="/tests/index"
data-method="get"
data-params='{"foo":"1","bar":"2"}'
data-pjax></a>
</div>
<div class="form">
<a class="new-action-new-method"
href="/search"
data-method="post"
data-form="method-form"
data-params='{"foo":"1","bar":"2"}'></a>
<a class="same-action-same-method"
href="/tests/search"
data-method="get"
data-form="method-form"
data-params='{"foo":"1","bar":"2"}'></a>
<a class="bad-action-new-method"
href="#"
data-method="post"
data-form="method-form"
data-params='{"foo":"1","bar":"2"}'></a>
<form id="method-form" method="get" action="/tests/search">
<input name="query" value="a">
</form>
<!-- https://github.com/yiisoft/yii2/pull/8014 -->
<a class="hidden-method-action"
href="/tests/search"
data-method="get"
data-form="form-hidden-method-action"
data-params='{"foo":"1","bar":"2"}'></a>
<form id="form-hidden-method-action" method="get" action="/tests/search">
<input name="query" value="a">
<input name="method" value="b" type="hidden">
<input name="action" value="c" type="hidden">
</form>
<a class="new-action-new-method-pjax"
href="/search"
data-method="post"
data-form="method-form"
data-params='{"foo":"1","bar":"2"}'
data-pjax></a>
</div>
</div>
</div>
<div class="data-methods">
<a id="data-methods-no-data" class="data-methods-element" href="/tests/index"></a>
<a id="data-methods-click-confirm"
class="data-methods-element"
href="/tests/index"
data-confirm="Are you sure?"></a>
<form>
<select id="data-methods-change" class="data-methods-element" data-method="get">
<option value="1">html</option>
<option value="2">css</option>
</select>
</form>
</div>
<div class="asset-filters">
<div class="scripts">
<script src="/js/existing1.js"></script>
<!-- To test correct work with absolute urls -->
<script src="http://foo.bar/js/existing2.js"></script>
</div>
<div class="stylesheets">
<link id="stylesheet1" href="/css/stylesheet1.css" rel="stylesheet">
<!-- To test correct work with absolute urls -->
<link id="stylesheet2" href="http://foo.bar/css/stylesheet2.css" rel="stylesheet">
</div>
</div>
</body>
</html>

162
tests/js/tests/yii.activeForm.test.js

@ -1,162 +0,0 @@
var assert = require('chai').assert;
var sinon;
var jsdom = require('mocha-jsdom');
var fs = require('fs');
var vm = require('vm');
describe('yii.activeForm', function () {
var yiiActiveFormPath = 'framework/jquery/assets/yii.activeForm.js';
var yiiPath = 'framework/jquery/assets/yii.js';
var jQueryPath = 'vendor/bower-asset/jquery/dist/jquery.js';
var $;
var $activeForm;
function registerYii() {
var code = fs.readFileSync(yiiPath);
var script = new vm.Script(code);
var sandbox = {window: window, jQuery: $};
var context = new vm.createContext(sandbox);
script.runInContext(context);
return sandbox.window.yii;
}
function registerTestableCode() {
var yii = registerYii();
var code = fs.readFileSync(yiiActiveFormPath);
var script = new vm.Script(code);
var context = new vm.createContext({window: window, document: window.document, yii: yii});
script.runInContext(context);
}
var activeFormHtml = fs.readFileSync('tests/js/data/yii.activeForm.html', 'utf-8');
var html = '<!doctype html><html><head><meta charset="utf-8"></head><body>' + activeFormHtml + '</body></html>';
jsdom({
html: html,
src: fs.readFileSync(jQueryPath, 'utf-8')
});
before(function () {
$ = window.$;
registerTestableCode();
sinon = require('sinon');
});
describe('validate method', function () {
var windowSetTimeoutStub;
var afterValidateSpy;
beforeEach(function () {
windowSetTimeoutStub = sinon.stub(window, 'setTimeout', function (callback) {
callback();
});
afterValidateSpy = sinon.spy();
});
afterEach(function () {
windowSetTimeoutStub.restore();
afterValidateSpy.reset();
});
describe('with forceValidate parameter set to true', function () {
it('should trigger manual form validation', function () {
var inputId = 'name';
$activeForm = $('#w0');
$activeForm.yiiActiveForm([
{
id: inputId,
input: '#' + inputId
}
]).on('afterValidate', afterValidateSpy);
$activeForm.yiiActiveForm('validate', true);
// https://github.com/yiisoft/yii2/issues/14510
assert.isTrue($activeForm.data('yiiActiveForm').validated);
// https://github.com/yiisoft/yii2/issues/14186
assert.isTrue(afterValidateSpy.calledOnce);
});
});
});
describe('resetForm method', function () {
var windowSetTimeoutStub;
beforeEach(function () {
windowSetTimeoutStub = sinon.stub(window, 'setTimeout', function (callback) {
callback();
});
});
afterEach(function () {
windowSetTimeoutStub.restore();
});
it('should remove classes from error element', function () {
var inputId = 'name';
var $input = $('#' + inputId);
var options = {
validatingCssClass: 'validating',
errorCssClass: 'error',
successCssClass: 'success',
validationStateOn: 'input'
};
$activeForm = $('#w0');
$activeForm.yiiActiveForm('destroy');
$activeForm.yiiActiveForm([
{
id: inputId,
input: '#' + inputId
}
], options);
$input.addClass(options.validatingCssClass);
$input.addClass(options.errorCssClass);
$input.addClass(options.successCssClass);
$input.addClass('test');
$activeForm.yiiActiveForm('resetForm');
assert.isFalse($input.hasClass(options.validatingCssClass));
assert.isFalse($input.hasClass(options.errorCssClass));
assert.isFalse($input.hasClass(options.successCssClass));
assert.isTrue($input.hasClass('test'));
});
});
describe('events', function () {
describe('afterValidateAttribute', function () {
var afterValidateAttributeSpy;
var eventData;
before(function () {
afterValidateAttributeSpy = sinon.spy(function (event, data) {
eventData = data;
});
});
after(function () {
afterValidateAttributeSpy.reset();
});
// https://github.com/yiisoft/yii2/issues/14318
it('should allow to get updated attribute value', function () {
var inputId = 'name';
var $input = $('#' + inputId);
$activeForm = $('#w0');
$activeForm.yiiActiveForm([
{
id: inputId,
input: '#' + inputId
}
]).on('afterValidateAttribute', afterValidateAttributeSpy);
$input.val('New value');
$activeForm.yiiActiveForm('updateAttribute', inputId);
assert.equal('New value', eventData.value);
});
});
});
});

151
tests/js/tests/yii.captcha.test.js

@ -1,151 +0,0 @@
var assert = require('chai').assert;
var sinon;
var withData = require('leche').withData;
var jsdom = require('mocha-jsdom');
var fs = require('fs');
var vm = require('vm');
describe('yii.captcha', function () {
var yiiCaptchaPath = 'framework/captcha/assets/yii.captcha.js';
var jQueryPath = 'vendor/bower-asset/jquery/dist/jquery.js';
var $;
var $captcha;
var settings = {
refreshUrl: '/site/captcha?refresh=1',
hashKey: 'yiiCaptcha/site/captcha'
};
function registerTestableCode() {
var code = fs.readFileSync(yiiCaptchaPath);
var script = new vm.Script(code);
var context = new vm.createContext({window: window});
script.runInContext(context);
}
var imgHtml = '<img id="captcha" class="captcha" src="/site/captcha/">' +
'<img id="captcha-2" class="captcha" src="/site/captcha/">';
var html = '<!doctype html><html><head><meta charset="utf-8"></head><body>' + imgHtml + '</body></html>';
jsdom({
html: html,
src: fs.readFileSync(jQueryPath, 'utf-8')
});
before(function () {
$ = window.$;
registerTestableCode();
sinon = require('sinon');
});
afterEach(function () {
if ($captcha.length) {
$captcha.yiiCaptcha('destroy');
}
});
describe('init', function () {
var customSettings = {
refreshUrl: '/posts/captcha?refresh=1',
hashKey: 'yiiCaptcha/posts/captcha'
};
withData({
'no method specified': [function () {
$captcha = $('.captcha').yiiCaptcha(settings);
}, settings],
'no method specified, custom options': [function () {
$captcha = $('.captcha').yiiCaptcha(customSettings);
}, customSettings],
'manual method call': [function () {
$captcha = $('.captcha').yiiCaptcha('init', settings);
}, settings]
}, function (initFunction, expectedSettings) {
it('should save settings for all elements', function () {
initFunction();
assert.deepEqual($('#captcha').data('yiiCaptcha'), {settings: expectedSettings});
assert.deepEqual($('#captcha-2').data('yiiCaptcha'), {settings: expectedSettings});
});
});
});
describe('refresh', function () {
var server;
var response = {hash1: 747, hash2: 748, url: '/site/captcha?v=584696959e038'};
beforeEach(function () {
server = sinon.fakeServer.create();
window.XMLHttpRequest = global.XMLHttpRequest;
});
afterEach(function () {
server.restore();
});
withData({
'click on the captcha': [function () {
$captcha.trigger('click');
}],
'manual method call': [function () {
$captcha.yiiCaptcha('refresh');
}]
}, function (refreshFunction) {
it('should send ajax request, update the image and data for client-side validation', function () {
$captcha = $('#captcha').yiiCaptcha(settings);
refreshFunction();
server.requests[0].respond(200, {"Content-Type": "application/json"}, JSON.stringify(response));
assert.lengthOf(server.requests, 1);
assert.include(server.requests[0].url, settings.refreshUrl + '&_=');
assert.include(server.requests[0].requestHeaders.Accept, 'application/json');
assert.equal($captcha.attr('src'), response.url);
assert.deepEqual($('body').data(settings.hashKey), [response.hash1, response.hash2]);
});
});
});
describe('destroy method', function () {
var ajaxStub;
before(function () {
ajaxStub = sinon.stub($, 'ajax');
});
after(function () {
ajaxStub.restore();
});
var message = 'should remove event handlers with saved settings for destroyed element only and return ' +
'initial jQuery object';
it(message, function () {
$captcha = $('.captcha').yiiCaptcha(settings);
var $captcha1 = $('#captcha');
var $captcha2 = $('#captcha-2');
var destroyResult = $captcha1.yiiCaptcha('destroy');
$captcha1.trigger('click');
$captcha2.trigger('click');
assert.strictEqual(destroyResult, $captcha1);
assert.isTrue(ajaxStub.calledOnce);
assert.isUndefined($captcha1.data('yiiCaptcha'));
assert.deepEqual($captcha2.data('yiiCaptcha'), {settings: settings});
});
});
describe('data method', function () {
it('should return saved settings', function () {
$captcha = $('#captcha').yiiCaptcha(settings);
assert.deepEqual($captcha.yiiCaptcha('data'), {settings: settings});
});
});
describe('call of not existing method', function () {
it('should throw according error', function () {
$captcha = $('#captcha').yiiCaptcha(settings);
assert.throws(function () {
$captcha.yiiCaptcha('foobar');
}, 'Method foobar does not exist in jQuery.yiiCaptcha');
});
});
});

791
tests/js/tests/yii.gridView.test.js

@ -1,791 +0,0 @@
var assert = require('chai').assert;
var sinon;
var withData = require('leche').withData;
var jsdom = require('mocha-jsdom');
var fs = require('fs');
var vm = require('vm');
describe('yii.gridView', function () {
var yiiGridViewPath = 'framework/jquery/assets/yii.gridView.js';
var yiiPath = 'framework/jquery/assets/yii.js';
var jQueryPath = 'vendor/bower-asset/jquery/dist/jquery.js';
var $;
var $gridView;
var settings = {
filterUrl: '/posts/index',
filterSelector: '#w0-filters input, #w0-filters select'
};
var commonSettings = {
filterUrl: '/posts/index',
filterSelector: '#w-common-filters input, #w-common-filters select'
};
var $textInput;
var $select;
var $multipleSelect;
var $listBox;
var $checkAllCheckbox;
var $checkRowCheckboxes;
function registerYii() {
var code = fs.readFileSync(yiiPath);
var script = new vm.Script(code);
var sandbox = {window: window, jQuery: $};
var context = new vm.createContext(sandbox);
script.runInContext(context);
return sandbox.window.yii;
}
function registerTestableCode() {
var yii = registerYii();
var code = fs.readFileSync(yiiGridViewPath);
var script = new vm.Script(code);
var context = new vm.createContext({window: window, document: window.document, yii: yii});
script.runInContext(context);
}
var gridViewHtml = fs.readFileSync('tests/js/data/yii.gridView.html', 'utf-8');
var html = '<!doctype html><html><head><meta charset="utf-8"></head><body>' + gridViewHtml + '</body></html>';
jsdom({
html: html,
src: fs.readFileSync(jQueryPath, 'utf-8')
});
before(function () {
$ = window.$;
registerTestableCode();
sinon = require('sinon');
});
beforeEach(function () {
$textInput = $('#w0-name');
$select = $('#w0-category');
$multipleSelect = $('#w0-tags');
$listBox = $('#w2-tags');
$checkAllCheckbox = $('#w0-check-all');
$checkRowCheckboxes = $('.w0-check-row');
});
afterEach(function () {
if ($gridView.length) {
$gridView.yiiGridView('destroy');
}
$textInput.val('');
$select.val('');
$multipleSelect.find('option:selected').prop('selected', false);
$listBox.find('option:selected').prop('selected', false);
$checkAllCheckbox.prop('checked', false);
$checkRowCheckboxes.prop('checked', false);
});
/**
* Simulate pressing "Enter" button while focused on some element
* @param $el
*/
function pressEnter($el) {
var e = $.Event('keydown', {keyCode: 13});
$el.trigger(e);
}
/**
* Simulate pressing keyboard button while focused on the text input. For simplicity, intended to use with letter
* buttons, such as "a", "b", etc. Case insensitive.
* @param $el
* @param buttonName
*/
function pressButton($el, buttonName) {
$el.val(buttonName);
var keyCode = buttonName.charCodeAt(0);
var e = $.Event('keydown', {keyCode: keyCode});
$el.trigger(e);
}
/**
* Simulate changing value in the select
* @param $el
* @param value
*/
function changeValue($el, value) {
$el.val(value);
var e = $.Event('change');
$el.trigger(e);
}
/**
* Simulate losing focus of the element after the value was changed
* @param $el
*/
function loseFocus($el) {
var e = $.Event('change');
$el.trigger(e);
}
/**
* Simulate click in the checkbox
* @param $el
*/
function click($el) {
var e = $.Event('click');
$el.trigger(e);
}
/**
* Simulate hovering on the new value and pressing "Enter" button in the select
* @param $el
*/
function hoverAndPressEnter($el) {
pressEnter($el);
// After pressing enter while hovering the value will be immediately changed as well like with losing focus
loseFocus($el);
}
describe('init', function () {
var customSettings = {
filterUrl: '/posts/filter',
filterSelector: '#w-common-filters input'
};
withData({
'no method specified': [function () {
$gridView = $('.grid-view').yiiGridView(commonSettings);
}, commonSettings],
'no method specified, custom settings': [function () {
$gridView = $('.grid-view').yiiGridView(customSettings);
}, customSettings],
'manual method call': [function () {
$gridView = $('.grid-view').yiiGridView('init', commonSettings);
}, commonSettings]
}, function (initFunction, expectedSettings) {
it('should save settings for all elements', function () {
initFunction();
assert.deepEqual($('#w0').yiiGridView('data'), {settings: expectedSettings});
assert.deepEqual($('#w1').yiiGridView('data'), {settings: expectedSettings});
});
});
describe('with repeated call', function () {
var jQuerySubmitStub;
before(function () {
jQuerySubmitStub = sinon.stub($.fn, 'submit');
});
after(function () {
jQuerySubmitStub.restore();
});
it('should remove "filter" event handler', function () {
$gridView = $('#w0').yiiGridView(settings);
$gridView.yiiGridView(settings);
// Change selector to make sure event handlers are removed regardless of the selector
$gridView.yiiGridView({
filterUrl: '/posts/index',
filterSelector: '#w0-filters select'
});
pressEnter($textInput);
assert.isFalse(jQuerySubmitStub.called);
changeValue($select, 1);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
});
});
describe('applyFilter', function () {
var jQuerySubmit = function () {
};
var jQuerySubmitStub;
beforeEach(function () {
jQuerySubmitStub = sinon.stub($.fn, 'submit', jQuerySubmit);
});
afterEach(function () {
jQuerySubmitStub.restore();
});
describe('with beforeFilter returning not false', function () {
var calledMethods = []; // For testing the order of called methods
var beforeFilterSpy;
var afterFilterSpy;
before(function () {
jQuerySubmit = function () {
calledMethods.push('submit');
return this;
};
beforeFilterSpy = sinon.spy(function () {
calledMethods.push('beforeFilter');
});
afterFilterSpy = sinon.spy(function () {
calledMethods.push('afterFilter');
});
});
after(function () {
jQuerySubmit = function () {
};
beforeFilterSpy.reset();
afterFilterSpy.reset();
calledMethods = [];
});
var message = 'should send the request to correct url with correct parameters and apply events in ' +
'correct order';
it(message, function () {
$gridView = $('#w0').yiiGridView(settings)
.on('beforeFilter', beforeFilterSpy)
.on('afterFilter', afterFilterSpy);
$textInput.val('a');
$select.val(1);
$multipleSelect.find('option[value="1"]').prop('selected', true);
$multipleSelect.find('option[value="2"]').prop('selected', true);
$gridView.yiiGridView('applyFilter');
var expectedHtml = '<form action="/posts/index" method="get" class="gridview-filter-form" ' +
'style="display:none" data-pjax="">' +
'<input type="hidden" name="PostSearch[name]" value="a">' +
'<input type="hidden" name="PostSearch[category_id]" value="1">' +
'<input type="hidden" name="PostSearch[tags][]" value="1">' +
'<input type="hidden" name="PostSearch[tags][]" value="2">' +
'</form>';
var $form = $('.grid-view .gridview-filter-form');
assert.equal($form.get(0).outerHTML, expectedHtml);
assert.isTrue(beforeFilterSpy.calledOnce);
assert.instanceOf(beforeFilterSpy.getCall(0).args[0], $.Event);
assert.equal($(beforeFilterSpy.getCall(0).args[0].target).attr('id'), $gridView.attr('id'));
assert.isTrue(jQuerySubmitStub.calledOnce);
assert.equal(jQuerySubmitStub.returnValues[0].attr('class'), 'gridview-filter-form');
assert.isTrue(afterFilterSpy.calledOnce);
assert.instanceOf(afterFilterSpy.getCall(0).args[0], $.Event);
assert.equal($(afterFilterSpy.getCall(0).args[0].target).attr('id'), $gridView.attr('id'));
assert.deepEqual(calledMethods, ['beforeFilter', 'submit', 'afterFilter']);
});
});
describe('with beforeFilter returning false', function () {
var beforeFilterSpy;
var afterFilterSpy;
before(function () {
beforeFilterSpy = sinon.spy(function () {
return false;
});
afterFilterSpy = sinon.spy();
});
after(function () {
beforeFilterSpy.reset();
afterFilterSpy.reset();
});
it('should prevent from sending request and triggering "afterFilter" event', function () {
$gridView = $('#w0').yiiGridView(settings)
.on('beforeFilter', beforeFilterSpy)
.on('afterFilter', afterFilterSpy);
$gridView.yiiGridView('applyFilter');
assert.isTrue(beforeFilterSpy.calledOnce);
assert.isFalse(jQuerySubmitStub.called);
assert.isFalse(afterFilterSpy.called);
});
});
describe('with different urls', function () {
describe('with no filter data sent', function () {
withData({
// https://github.com/yiisoft/yii2/issues/13738
'question mark, no query parameters': [
'/posts/index?',
'/posts/index',
'PostSearch[name]=&PostSearch[category_id]='
],
'query parameters': [
'/posts/index?foo=1&bar=2',
'/posts/index',
'PostSearch[name]=&PostSearch[category_id]=&foo=1&bar=2'
],
// https://github.com/yiisoft/yii2/pull/10302
'query parameter with multiple values (not array)': [
'/posts/index?foo=1&foo=2',
'/posts/index',
'PostSearch[name]=&PostSearch[category_id]=&foo=1&foo=2'
],
'query parameter with multiple values (array)': [
'/posts/index?foo[]=1&foo[]=2',
'/posts/index',
'PostSearch[name]=&PostSearch[category_id]=&foo[]=1&foo[]=2'
],
// https://github.com/yiisoft/yii2/issues/12836
'anchor': [
'/posts/index#post',
'/posts/index#post',
'PostSearch[name]=&PostSearch[category_id]='
],
'query parameters, anchor': [
'/posts/index?foo=1&bar=2#post',
'/posts/index#post',
'PostSearch[name]=&PostSearch[category_id]=&foo=1&bar=2'
],
'relative url, query parameters': [
'?foo=1&bar=2',
'',
'PostSearch[name]=&PostSearch[category_id]=&foo=1&bar=2'
],
'relative url, anchor': [
'#post',
'#post',
'PostSearch[name]=&PostSearch[category_id]='
],
'relative url, query parameters, anchor': [
'?foo=1&bar=2#post',
'#post',
'PostSearch[name]=&PostSearch[category_id]=&foo=1&bar=2'
]
}, function (filterUrl, expectedUrl, expectedQueryString) {
it('should send the request to correct url with correct parameters', function () {
var customSettings = $.extend({}, settings, {filterUrl: filterUrl});
$gridView = $('#w0').yiiGridView(customSettings);
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
assert.isTrue(jQuerySubmitStub.calledOnce);
assert.equal($form.attr('action'), expectedUrl);
assert.equal(decodeURIComponent($form.serialize()), expectedQueryString);
});
});
});
// https://github.com/yiisoft/yii2/pull/10302
describe('with filter data sent', function () {
it('should send the request to correct url with new parameter values', function () {
var filterUrl = '/posts/index?CategorySearch[id]=5&CategorySearch[name]=c' +
'&PostSearch[name]=a&PostSearch[category_id]=1&PostSearch[tags][]=1&PostSearch[tags][]=2' +
'&foo[]=1&foo[]=2&bar=1#post';
var customSettings = $.extend({}, settings, {filterUrl: filterUrl});
$gridView = $('#w0').yiiGridView(customSettings);
$textInput.val('b');
$select.val('1'); // Leave value as is (simulate setting "selected" in HTML)
$multipleSelect.find('option[value="2"]').prop('selected', true);
$multipleSelect.find('option[value="3"]').prop('selected', true);
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
assert.isTrue(jQuerySubmitStub.calledOnce);
assert.equal($form.attr('action'), '/posts/index#post');
// Parameters not related with current filter are appended to the end
var expectedQueryString = 'PostSearch[name]=b&PostSearch[category_id]=1' +
'&PostSearch[tags][]=2&PostSearch[tags][]=3' +
'&CategorySearch[id]=5&CategorySearch[name]=c' +
'&foo[]=1&foo[]=2&bar=1';
assert.equal(decodeURIComponent($form.serialize()), expectedQueryString);
});
});
});
describe('with list box', function () {
describe('with values selected', function () {
it('should send the request to correct url with correct parameters', function () {
$listBox.find('option[value="1"]').prop('selected', true);
$listBox.find('option[value="2"]').prop('selected', true);
$gridView = $('#w2').yiiGridView({
filterUrl: '/posts/index',
filterSelector: '#w2-filters input, #w2-filters select'
});
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
var expectedQueryString = 'PostSearch[name]=&PostSearch[tags]=-1&PostSearch[tags][]=1' +
'&PostSearch[tags][]=2';
assert.equal($form.attr('action'), '/posts/index');
assert.equal(decodeURIComponent($form.serialize()), expectedQueryString);
});
});
// https://github.com/yiisoft/yii2/pull/10284
describe('with unselected values after applied filter', function () {
it('should send the request to correct url with correct parameters', function () {
$listBox.find('option[value="1"]').prop('selected', true);
$listBox.find('option[value="2"]').prop('selected', true);
var filterUrl = '/posts/index/?PostSearch[name]=&PostSearch[tags]=-1&PostSearch[tags][]=1' +
'&PostSearch[tags][]=2';
$gridView = $('#w2').yiiGridView({
filterUrl: filterUrl,
filterSelector: '#w2-filters input, #w2-filters select'
});
$listBox.find('option:selected').prop('selected', false);
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
assert.equal($form.attr('action'), '/posts/index/');
assert.equal(decodeURIComponent($form.serialize()), 'PostSearch[name]=&PostSearch[tags]=-1');
});
});
// https://github.com/yiisoft/yii2/issues/13379
describe('with applied pagination', function () {
it("should correctly change multiple select's data", function () {
$listBox.find('option[value="2"]').prop('selected', true);
$listBox.find('option[value="3"]').prop('selected', true);
var filterUrl = '/posts/index?PostSearch[tags]=-1PostSearch[tags][0]=2&PostSearch[tags][1]=3' +
'&page=2&per-page=2';
$gridView = $('#w2').yiiGridView({
filterUrl: filterUrl,
filterSelector: '#w2-filters input, #w2-filters select'
});
$listBox.find('option[value="4"]').prop('selected', true);
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
var expectedQueryString = 'PostSearch[name]=' +
'&PostSearch[tags]=-1&PostSearch[tags][]=2&PostSearch[tags][]=3&PostSearch[tags][]=4' +
'&page=2&per-page=2';
assert.equal(decodeURIComponent($form.serialize()), expectedQueryString);
});
});
});
describe('with repeated method call', function () {
it('should delete the hidden form', function () {
$gridView = $('#w0').yiiGridView(settings);
$gridView.yiiGridView('applyFilter');
$gridView.yiiGridView('applyFilter');
var $form = $gridView.find('.gridview-filter-form');
assert.lengthOf($form, 1);
});
});
describe('with filter event handlers', function () {
beforeEach(function () {
$gridView = $('#w0').yiiGridView(settings);
});
describe('with text entered in the text input', function () {
it('should not submit form', function () {
pressButton($textInput, 'a');
assert.isFalse(jQuerySubmitStub.called);
});
});
describe('with "Enter" pressed in the text input', function () {
it('should submit form once', function () {
pressEnter($textInput);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
});
describe('with text entered in the text input and lost focus', function () {
it('should submit form once', function () {
pressButton($textInput, 'a');
loseFocus($textInput);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
});
describe('with value changed in the select', function () {
it('should submit form once', function () {
changeValue($select, 1);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
});
describe('with hover on different value and "Enter" pressed in select', function () {
it('should submit form once', function () {
// Simulate hovering on new value and pressing "Enter"
$select.val(1);
hoverAndPressEnter($select);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
});
});
});
describe('setSelectionColumn method', function () {
describe('with name option and', function () {
withData({
'nothing else': [{}],
'checkAll option': [{checkAll: 'selection_all'}],
'multiple option set to true': [{multiple: true}],
'multiple and checkAll options, multiple set to false': [{multiple: false, checkAll: 'selection_all'}]
}, function (customOptions) {
it('should update data and do not activate "check all" functionality', function () {
$gridView = $('#w0').yiiGridView(settings);
var defaultOptions = {name: 'selection[]'};
var options = $.extend({}, defaultOptions, customOptions);
$gridView.yiiGridView('setSelectionColumn', options);
assert.equal($gridView.yiiGridView('data').selectionColumn, 'selection[]');
click($checkAllCheckbox);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 0);
click($checkAllCheckbox); // Back to initial condition
click($checkRowCheckboxes);
assert.isFalse($checkAllCheckbox.prop('checked'));
});
});
});
describe('with name, multiple and checkAll options, multiple set to true and', function () {
withData({
'nothing else': [{}],
// https://github.com/yiisoft/yii2/pull/11729
'class option': [{'class': 'w0-check-row'}]
}, function (customOptions) {
it('should update data and "check all" functionality should work', function () {
$gridView = $('#w0').yiiGridView(settings);
var defaultOptions = {name: 'selection[]', multiple: true, checkAll: 'selection_all'};
var options = $.extend({}, defaultOptions, customOptions);
$gridView.yiiGridView('setSelectionColumn', options);
assert.equal($gridView.yiiGridView('data').selectionColumn, 'selection[]');
var $checkFirstRowCheckbox = $checkRowCheckboxes.filter('[value="1"]');
// Check all
click($checkAllCheckbox);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
assert.isTrue($checkAllCheckbox.prop('checked'));
// Uncheck all
click($checkAllCheckbox);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 0);
assert.isFalse($checkAllCheckbox.prop('checked'));
// Check all manually
click($checkRowCheckboxes);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
assert.isTrue($checkAllCheckbox.prop('checked'));
// Uncheck all manually
click($checkRowCheckboxes);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 0);
assert.isFalse($checkAllCheckbox.prop('checked'));
// Check first row
click($checkFirstRowCheckbox);
assert.isTrue($checkFirstRowCheckbox.prop('checked'));
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 1);
assert.isFalse($checkAllCheckbox.prop('checked'));
// Then check all
click($checkAllCheckbox);
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 3);
assert.isTrue($checkAllCheckbox.prop('checked'));
// Uncheck first row
click($checkFirstRowCheckbox);
assert.isFalse($checkFirstRowCheckbox.prop('checked'));
assert.lengthOf($checkRowCheckboxes.filter(':checked'), 2);
assert.isFalse($checkAllCheckbox.prop('checked'));
});
});
});
describe('with repeated calls', function () {
var jQueryPropStub;
before(function () {
jQueryPropStub = sinon.stub($, 'prop');
});
after(function () {
jQueryPropStub.restore();
});
it('should not duplicate event handler calls', function () {
$gridView = $('#w3').yiiGridView({
filterUrl: '/posts/index',
filterSelector: '#w3-filters input, #w3-filters select'
});
$gridView.yiiGridView('setSelectionColumn', {
name: 'selection[]',
multiple: true,
checkAll: 'selection_all'
});
// Change selectors to make sure event handlers are removed regardless of the selector
$gridView.yiiGridView('setSelectionColumn', {
name: 'selection2[]',
multiple: true,
checkAll: 'selection_all2'
});
$gridView.yiiGridView('setSelectionColumn', {
name: 'selection[]',
multiple: true,
checkAll: 'selection_all'
});
$gridView.yiiGridView('setSelectionColumn', {
'class': 'w3-check-row',
multiple: true,
checkAll: 'selection_all'
});
// Check first row ("prop" should be called once)
click($gridView.find('input[name="selection[]"][value="1"]'));
// Check all rows ("prop" should be called 2 times, 1 time for each row)
click($gridView.find('input[name="selection_all"]'));
assert.equal(jQueryPropStub.callCount, 3);
});
});
});
describe('getSelectedRows method', function () {
withData({
'selectionColumn not set, no rows selected': [undefined, [], false, []],
'selectionColumn not set, 1st and 2nd rows selected': [undefined, [1, 2], false, []],
'selectionColumn set, no rows selected': ['selection[]', [], false, []],
'selectionColumn set, 1st row selected': ['selection[]', [1], false, [1]],
'selectionColumn set, 1st and 2nd rows selected': ['selection[]', [1, 2], false, [1, 2]],
'selectionColumn set, all rows selected, "Check all" checkbox checked': [
'selection[]', [1, 2, 3], true, [1, 2, 3]
]
}, function (selectionColumn, selectedRows, checkAll, expectedSelectedRows) {
it('should return array with ids of selected rows', function () {
$gridView = $('#w0').yiiGridView(settings);
$gridView.yiiGridView('setSelectionColumn', {name: selectionColumn});
for (var i = 0; i < selectedRows.length; i++) {
$checkRowCheckboxes.filter('[value="' + selectedRows[i] + '"]').prop('checked', true);
}
if (checkAll) {
$checkAllCheckbox.prop('checked', true);
}
assert.deepEqual($gridView.yiiGridView('getSelectedRows'), expectedSelectedRows);
});
});
});
describe('destroy method', function () {
var jQuerySubmitStub;
var jQueryPropStub;
var beforeFilterSpy;
var afterFilterSpy;
beforeEach(function () {
jQuerySubmitStub = sinon.stub($.fn, 'submit');
jQueryPropStub = sinon.stub($, 'prop');
beforeFilterSpy = sinon.spy();
afterFilterSpy = sinon.spy();
});
afterEach(function () {
jQuerySubmitStub.restore();
jQueryPropStub.restore();
beforeFilterSpy.reset();
afterFilterSpy.reset();
});
it('should remove saved settings for destroyed element only and return initial jQuery object', function () {
$gridView = $('.grid-view').yiiGridView(commonSettings);
var $gridView1 = $('#w0');
var $gridView2 = $('#w1');
var destroyResult = $gridView1.yiiGridView('destroy');
assert.strictEqual(destroyResult, $gridView1);
assert.isUndefined($gridView1.yiiGridView('data'));
assert.deepEqual($gridView2.yiiGridView('data'), {settings: commonSettings});
});
it('should remove "beforeFilter" and "afterFilter" event handlers for destroyed element only', function () {
$gridView = $('.grid-view').yiiGridView(commonSettings)
.on('beforeFilter', beforeFilterSpy)
.on('afterFilter', afterFilterSpy);
var $gridView1 = $('#w0');
var $gridView2 = $('#w1');
$gridView1.yiiGridView('destroy');
assert.throws(function () {
$gridView1.yiiGridView('applyFilter');
}, "Cannot read property 'settings' of undefined");
$gridView1.yiiGridView(settings); // Reinitialize without "beforeFilter" and "afterFilter" event handlers
$gridView1.yiiGridView('applyFilter');
assert.isTrue(jQuerySubmitStub.calledOnce);
assert.isFalse(beforeFilterSpy.called);
assert.isFalse(afterFilterSpy.called);
$gridView2.yiiGridView('applyFilter');
assert.isTrue(jQuerySubmitStub.calledTwice);
assert.isTrue(beforeFilterSpy.calledOnce);
assert.isTrue(afterFilterSpy.calledOnce);
});
it('should remove "filter" event handler for destroyed element only', function () {
var $gridView1 = $('#w0');
var $gridView2 = $('#w1');
$gridView1.yiiGridView(settings);
$gridView2.yiiGridView({
filterUrl: '/posts/index',
filterSelector: '#w1-filters input, #w1-filters select'
});
$gridView2.yiiGridView('destroy');
pressEnter($gridView2.find('input[name="PostSearch[id]"]'));
assert.isFalse(jQuerySubmitStub.called);
pressEnter($textInput);
assert.isTrue(jQuerySubmitStub.calledOnce);
});
it('should remove "checkRow" and "checkAllRows" filter event handlers for destroyed element only', function () {
$gridView = $('.grid-view').yiiGridView(commonSettings);
var options = {name: 'selection[]', multiple: true, checkAll: 'selection_all'};
var $gridView1 = $('#w0');
var $gridView2 = $('#w1');
$gridView1.yiiGridView('setSelectionColumn', options);
$gridView2.yiiGridView('setSelectionColumn', options);
$gridView2.yiiGridView('destroy');
click($gridView2.find('input[name="selection_all"]'));
click($gridView2.find('input[name="selection[]"][value="1"]'));
assert.equal(jQueryPropStub.callCount, 0);
click($checkRowCheckboxes.filter('[value="1"]')); // Check first row ("prop" should be called once)
click($checkAllCheckbox); // Check all rows ("prop" should be called 3 times, 1 time for each row)
assert.equal(jQueryPropStub.callCount, 4);
});
});
describe('data method', function () {
it('should return saved settings', function () {
$gridView = $('#w0').yiiGridView(settings);
assert.deepEqual($gridView.yiiGridView('data'), {settings: settings});
});
});
describe('call of not existing method', function () {
it('should throw according error', function () {
$gridView = $('#w0').yiiGridView(settings);
assert.throws(function () {
$gridView.yiiGridView('foobar');
}, 'Method foobar does not exist in jQuery.yiiGridView');
});
});
});

1415
tests/js/tests/yii.test.js

File diff suppressed because it is too large Load Diff

1667
tests/js/tests/yii.validation.test.js

File diff suppressed because it is too large Load Diff

56
tests/mssql/Dockerfile

@ -1,56 +0,0 @@
FROM bylexus/apache-php7
# https://www.microsoft.com/en-us/sql-server/developer-get-started/php-ubuntu
RUN apt-get update
RUN apt-get install -y curl apt-transport-https
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > /etc/apt/sources.list.d/mssql-release.list
RUN apt-get update \
&& apt-get install -y unixodbc-dev-utf16 php-dev \
&& pecl install sqlsrv pdo_sqlsrv
RUN echo "extension=/usr/lib/php/20151012/sqlsrv.so" >> /etc/php/7.0/apache2/php.ini
RUN echo "extension=/usr/lib/php/20151012/pdo_sqlsrv.so" >> /etc/php/7.0/apache2/php.ini
RUN echo "extension=/usr/lib/php/20151012/sqlsrv.so" >> /etc/php/7.0/cli/php.ini
RUN echo "extension=/usr/lib/php/20151012/pdo_sqlsrv.so" >> /etc/php/7.0/cli/php.ini
# IMPORTANT NOTICE! Install `msodbcsql` after `unixodbc-dev-utf16` and `pdo_sqlsrv`, due to dependency & build issues
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql
# Install system packages for composer (git)
RUN apt-get update && \
apt-get -y install \
git \
php-curl \
--no-install-recommends && \
rm -rf /tmp/* /var/tmp/*
# Register the COMPOSER_HOME environment variable
ENV COMPOSER_HOME /composer
# Add global binary directory to PATH and make sure to re-export it
ENV PATH /usr/local/bin:$PATH
# Allow Composer to be run as root
ENV COMPOSER_ALLOW_SUPERUSER 1
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- \
--filename=composer.phar \
--install-dir=/usr/local/bin
RUN composer.phar global require --optimize-autoloader \
"hirak/prestissimo"
# Project source-code
WORKDIR /project
ADD composer.* /project/
RUN /usr/local/bin/composer.phar install --prefer-dist
ADD ./ /project
# https://github.com/Microsoft/msphpsql/issues/161
RUN apt-get install -y locales \
&& echo "en_US.UTF-8 UTF-8" > /etc/locale.gen \
&& locale-gen
# Debug installation
RUN dpkg -L msodbcsql

34
tests/mssql/docker-compose.yml

@ -1,34 +0,0 @@
version: '2'
services:
php:
build:
context: ../..
dockerfile: tests/mssql/Dockerfile
# Alternative pre-built image (TODO: evaluate)
#image: ppoffice/apache-php-mssql-odbc
ports:
- 80
# Enable for debugging, Note: File-cache tests may be VERY slow or fail
#volumes:
# - ../../..:/project
depends_on:
- mssql
# Enable for debugging
#entrypoint: ['bash']
mssql:
image: microsoft/mssql-server-linux
# Alternative pre-built image (TODO: evaluate)
#image: microsoft/mssql-server-windows
environment:
- ACCEPT_EULA=Y
- SA_PASSWORD=Microsoft-12345
sqlcmd:
image: tsgkadot/mssql-tools
# Mount project for accessing SQL dump (TODO)
volumes:
- ../..:/project
# Enable for debugging
#entrypoint: ['bash']
Loading…
Cancel
Save