@@ -1290,6 +1290,119 @@ module.exports = function() {
1290
1290
} ) ;
1291
1291
} ) ;
1292
1292
1293
+ it ( 'commits both of two identical ops submitted from different clients by default' , function ( done ) {
1294
+ var backend = this . backend ;
1295
+ backend . doNotCommitNoOps = false ;
1296
+ var doc1 = backend . connect ( ) . get ( 'dogs' , id ) ;
1297
+ var doc2 = backend . connect ( ) . get ( 'dogs' , id ) ;
1298
+ var op = [ { p : [ 'tricks' , 0 ] , ld : 'fetch' } ] ;
1299
+
1300
+ async . series ( [
1301
+ doc1 . create . bind ( doc1 , { tricks : [ 'fetch' , 'sit' ] } ) ,
1302
+ doc2 . fetch . bind ( doc2 ) ,
1303
+ async . parallel . bind ( async . parallel , [
1304
+ doc1 . submitOp . bind ( doc1 , op ) ,
1305
+ doc2 . submitOp . bind ( doc2 , op )
1306
+ ] ) ,
1307
+ function ( next ) {
1308
+ expect ( doc1 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1309
+ expect ( doc2 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1310
+ next ( ) ;
1311
+ } ,
1312
+ function ( next ) {
1313
+ backend . db . getOps ( 'dogs' , id , 0 , null , { } , function ( error , ops ) {
1314
+ if ( error ) return next ( error ) ;
1315
+ // Expect:
1316
+ // v0: create
1317
+ // v1: update
1318
+ // v2: duplicate update
1319
+ expect ( ops ) . to . have . length ( 3 ) ;
1320
+ next ( ) ;
1321
+ } ) ;
1322
+ }
1323
+ ] , done ) ;
1324
+ } ) ;
1325
+
1326
+ it ( 'only commits one of two identical ops submitted from different clients' , function ( done ) {
1327
+ var backend = this . backend ;
1328
+ backend . doNotCommitNoOps = true ;
1329
+ var doc1 = backend . connect ( ) . get ( 'dogs' , id ) ;
1330
+ var doc2 = backend . connect ( ) . get ( 'dogs' , id ) ;
1331
+ var op = [ { p : [ 'tricks' , 0 ] , ld : 'fetch' } ] ;
1332
+
1333
+ async . series ( [
1334
+ doc1 . create . bind ( doc1 , { tricks : [ 'fetch' , 'sit' ] } ) ,
1335
+ doc2 . fetch . bind ( doc2 ) ,
1336
+ async . parallel . bind ( async . parallel , [
1337
+ doc1 . submitOp . bind ( doc1 , op ) ,
1338
+ doc2 . submitOp . bind ( doc2 , op )
1339
+ ] ) ,
1340
+ function ( next ) {
1341
+ expect ( doc1 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1342
+ expect ( doc2 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1343
+ next ( ) ;
1344
+ } ,
1345
+ function ( next ) {
1346
+ backend . db . getOps ( 'dogs' , id , 0 , null , { } , function ( error , ops ) {
1347
+ if ( error ) return next ( error ) ;
1348
+ // Expect:
1349
+ // v0: create
1350
+ // v1: update
1351
+ // no duplicate update
1352
+ expect ( ops ) . to . have . length ( 2 ) ;
1353
+ next ( ) ;
1354
+ } ) ;
1355
+ }
1356
+ ] , done ) ;
1357
+ } ) ;
1358
+
1359
+ it ( 'can submit a new op after getting a no-op' , function ( done ) {
1360
+ var backend = this . backend ;
1361
+ backend . doNotCommitNoOps = true ;
1362
+ var doc1 = backend . connect ( ) . get ( 'dogs' , id ) ;
1363
+ var doc2 = backend . connect ( ) . get ( 'dogs' , id ) ;
1364
+ var op = [ { p : [ 'tricks' , 0 ] , ld : 'fetch' } ] ;
1365
+
1366
+ async . series ( [
1367
+ doc1 . create . bind ( doc1 , { tricks : [ 'fetch' , 'sit' ] } ) ,
1368
+ doc2 . fetch . bind ( doc2 ) ,
1369
+ async . parallel . bind ( async . parallel , [
1370
+ doc1 . submitOp . bind ( doc1 , op ) ,
1371
+ doc2 . submitOp . bind ( doc2 , op )
1372
+ ] ) ,
1373
+ function ( next ) {
1374
+ expect ( doc1 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1375
+ expect ( doc2 . data ) . to . eql ( { tricks : [ 'sit' ] } ) ;
1376
+ next ( ) ;
1377
+ } ,
1378
+ doc1 . submitOp . bind ( doc1 , [ { p : [ 'tricks' , 0 ] , li : 'play dead' } ] ) ,
1379
+ function ( next ) {
1380
+ expect ( doc1 . data . tricks ) . to . eql ( [ 'play dead' , 'sit' ] ) ;
1381
+ next ( ) ;
1382
+ }
1383
+ ] , done ) ;
1384
+ } ) ;
1385
+
1386
+ it ( 'fixes up even if an op is fixed up to become a no-op' , function ( done ) {
1387
+ var backend = this . backend ;
1388
+ backend . doNotCommitNoOps = true ;
1389
+ var doc = backend . connect ( ) . get ( 'dogs' , id ) ;
1390
+
1391
+ backend . use ( 'apply' , function ( req , next ) {
1392
+ req . $fixup ( [ { p : [ 'fixme' ] , od : true } ] ) ;
1393
+ next ( ) ;
1394
+ } ) ;
1395
+
1396
+ async . series ( [
1397
+ doc . create . bind ( doc , { } ) ,
1398
+ doc . submitOp . bind ( doc , [ { p : [ 'fixme' ] , oi : true } ] ) ,
1399
+ function ( next ) {
1400
+ expect ( doc . data ) . to . eql ( { } ) ;
1401
+ next ( ) ;
1402
+ }
1403
+ ] , done ) ;
1404
+ } ) ;
1405
+
1293
1406
describe ( 'type.deserialize' , function ( ) {
1294
1407
it ( 'can create a new doc' , function ( done ) {
1295
1408
var doc = this . backend . connect ( ) . get ( 'dogs' , id ) ;
0 commit comments