summaryrefslogtreecommitdiff
path: root/jstests/core/rename_collection.js
blob: 6f32699a7330d1da383db397953894bad74a864b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
 * Basic test around rename collection
 *
 * @tags: [
 *   requires_fcv_50,
 *   requires_non_retryable_commands,
 *   assumes_no_implicit_collection_creation_after_drop
 * ]
 */

(function() {
"use strict";

const collNamePrefix = "rename_coll_test_";
let collCounter = 0;

function getNewCollName() {
    return collNamePrefix + collCounter++;
}

function getNewColl() {
    let coll = db[getNewCollName()];
    coll.drop();
    return coll;
}

jsTest.log("Rename collection with documents (create SRC and then DST)");
{
    const src = getNewColl();
    const dstName = getNewCollName();

    src.save({x: 1});
    src.save({x: 2});
    src.save({x: 3});

    assert.eq(3, src.countDocuments({}));

    assert.commandWorked(src.renameCollection(dstName));

    assert.eq(0, src.countDocuments({}));
    const dst = db[dstName];
    assert.eq(3, dst.countDocuments({}));
    dst.drop();
}

jsTest.log("Rename collection with documents (create DST and then SRC)");
{
    const src = getNewColl();
    const dstName = getNewCollName();

    src.save({x: 1});
    src.save({x: 2});
    src.save({x: 3});

    assert.eq(3, src.countDocuments({}));

    assert.commandWorked(src.renameCollection(dstName));

    assert.eq(0, src.countDocuments({}));
    const dst = db[dstName];
    assert.eq(3, dst.countDocuments({}));
    dst.drop();
}

jsTest.log("Rename collection with indexes");
{
    const src = getNewColl();
    const dstName = getNewCollName();
    const existingDst = getNewColl();

    src.save({a: 1});
    src.save({a: 2});
    src.createIndex({a: 1});
    src.createIndex({b: 1});

    existingDst.save({a: 100});
    assert.commandFailed(
        db.adminCommand({renameCollection: src.getFullName(), to: existingDst.getFullName()}));

    const originalNumberOfIndexes = src.getIndexes().length;
    assert.commandWorked(src.renameCollection(dstName));
    assert.eq(0, src.countDocuments({}));

    const dst = db[dstName];
    assert.eq(2, dst.countDocuments({}));
    assert(db.getCollectionNames().indexOf(dst.getName()) >= 0);
    assert(db.getCollectionNames().indexOf(src.getName()) < 0);
    assert.eq(originalNumberOfIndexes, dst.getIndexes().length);
    assert.eq(0, src.getIndexes().length);
    dst.drop();
}

jsTest.log("Rename collection with existing target");
{
    const src = getNewColl();
    const dst = getNewColl();

    src.save({x: 1});
    dst.save({x: 2});

    assert.eq(1, src.countDocuments({x: 1}));
    assert.eq(1, dst.countDocuments({x: 2}));

    assert.commandFailed(src.renameCollection(dst.getName()));

    assert.eq(1, src.countDocuments({x: 1}));
    assert.eq(1, dst.countDocuments({x: 2}));

    assert.commandWorked(src.renameCollection(dst.getName(), true /* dropTarget */));

    assert.eq(0, src.countDocuments({x: 2}));
    assert.eq(1, dst.countDocuments({}));

    dst.drop();
}
})();