1+ import "reflect-metadata" ;
2+ import { createTestingConnections , closeTestingConnections , reloadTestingDatabases } from "../../utils/test-utils" ;
3+ import { Connection } from "../../../src/connection/Connection" ;
4+ import { User } from "./entity/User" ;
5+
6+ describe ( "github issues > #4513 CockroachDB support for onConflict" , ( ) => {
7+
8+ let connections : Connection [ ] ;
9+ before ( async ( ) => connections = await createTestingConnections ( {
10+ entities : [ __dirname + "/entity/*{.js,.ts}" ] ,
11+ schemaCreate : true ,
12+ dropSchema : true ,
13+ enabledDrivers : [ "cockroachdb" ]
14+ } ) ) ;
15+ beforeEach ( ( ) => reloadTestingDatabases ( connections ) ) ;
16+ after ( ( ) => closeTestingConnections ( connections ) ) ;
17+
18+ it ( "should insert if no conflict" , ( ) => Promise . all ( connections . map ( async connection => {
19+ const user1 = new User ( ) ;
20+ user1 . name = "example" ;
21+ user1 . email = "[email protected] " ; 22+ user1 . age = 30 ;
23+
24+ await connection . createQueryBuilder ( )
25+ . insert ( )
26+ . into ( User )
27+ . values ( user1 )
28+ . execute ( ) ;
29+
30+ const user2 = new User ( ) ;
31+ user2 . name = "example2" ;
32+ user2 . email = "[email protected] " ; 33+ user2 . age = 42 ;
34+
35+ await connection . createQueryBuilder ( )
36+ . insert ( )
37+ . into ( User )
38+ . values ( user2 )
39+ . onConflict ( `("name", "email") DO NOTHING` )
40+ . execute ( ) ;
41+
42+ await connection . manager . find ( User ) . should . eventually . have . lengthOf ( 2 ) ;
43+ } ) ) ) ;
44+
45+ it ( "should update on conflict with do update" , ( ) => Promise . all ( connections . map ( async connection => {
46+ const user1 = new User ( ) ;
47+ user1 . name = "example" ;
48+ user1 . email = "[email protected] " ; 49+ user1 . age = 30 ;
50+
51+ await connection . createQueryBuilder ( )
52+ . insert ( )
53+ . into ( User )
54+ . values ( user1 )
55+ . execute ( ) ;
56+
57+ const user2 = new User ( ) ;
58+ user2 . name = "example" ;
59+ user2 . email = "[email protected] " ; 60+ user2 . age = 42 ;
61+
62+ await connection . createQueryBuilder ( )
63+ . insert ( )
64+ . into ( User )
65+ . values ( user2 )
66+ . onConflict ( `("name", "email") DO UPDATE SET age = EXCLUDED.age` )
67+ . execute ( ) ;
68+
69+ await connection . manager . findOne ( User , { name :
"example" , email :
"[email protected] " } ) . should . eventually . be . eql ( { 70+ name : "example" ,
71+ 72+ age : 42 ,
73+ } ) ;
74+ } ) ) ) ;
75+
76+ it ( "should not update on conflict with do nothing" , ( ) => Promise . all ( connections . map ( async connection => {
77+ const user1 = new User ( ) ;
78+ user1 . name = "example" ;
79+ user1 . email = "[email protected] " ; 80+ user1 . age = 30 ;
81+
82+ await connection . createQueryBuilder ( )
83+ . insert ( )
84+ . into ( User )
85+ . values ( user1 )
86+ . execute ( ) ;
87+
88+ const user2 = new User ( ) ;
89+ user2 . name = "example" ;
90+ user2 . email = "[email protected] " ; 91+ user2 . age = 42 ;
92+
93+ await connection . createQueryBuilder ( )
94+ . insert ( )
95+ . into ( User )
96+ . values ( user2 )
97+ . onConflict ( `("name", "email") DO NOTHING` )
98+ . execute ( ) ;
99+
100+ await connection . manager . findOne ( User , { name :
"example" , email :
"[email protected] " } ) . should . eventually . be . eql ( { 101+ name : "example" ,
102+ 103+ age : 30 ,
104+ } ) ;
105+ } ) ) ) ;
106+
107+ it ( "should update with orUpdate" , ( ) => Promise . all ( connections . map ( async connection => {
108+ const user1 = new User ( ) ;
109+ user1 . name = "example" ;
110+ user1 . email = "[email protected] " ; 111+ user1 . age = 30 ;
112+
113+ await connection . createQueryBuilder ( )
114+ . insert ( )
115+ . into ( User )
116+ . values ( user1 )
117+ . execute ( ) ;
118+
119+ const user2 = new User ( ) ;
120+ user2 . name = "example" ;
121+ user2 . email = "[email protected] " ; 122+ user2 . age = 42 ;
123+
124+ await connection . createQueryBuilder ( )
125+ . insert ( )
126+ . into ( User )
127+ . values ( user2 )
128+ . orUpdate ( {
129+ conflict_target : [ "name" , "email" ] ,
130+ overwrite : [ "age" ] ,
131+ } )
132+ . execute ( ) ;
133+
134+ await connection . manager . findOne ( User , { name :
"example" , email :
"[email protected] " } ) . should . eventually . be . eql ( { 135+ name : "example" ,
136+ 137+ age : 42 ,
138+ } ) ;
139+ } ) ) ) ;
140+ } ) ;
0 commit comments