// Test aggregating a sharded collection while using $graphLookup on an unsharded collection.
(function() {
'use strict';

const st = new ShardingTest({shards: 2, rs: {nodes: 1}});

assert.commandWorked(st.s0.adminCommand({enablesharding: "test"}));
assert.commandWorked(st.s0.adminCommand({shardCollection: "test.foo", key: {_id: "hashed"}}));

let db = st.s0.getDB("test");

assert.commandWorked(db.foo.insert([{}, {}, {}, {}]));
assert.commandWorked(db.bar.insert({_id: 1, x: 1}));

const res = db.foo
                    .aggregate([{
                        $graphLookup: {
                            from: "bar",
                            startWith: {$literal: 1},
                            connectFromField: "x",
                            connectToField: "_id",
                            as: "res"
                        }
                    }])
                    .toArray();

assert.eq(res.length, 4);
res.forEach(function(c) {
    assert.eq(c.res.length, 1);
    assert.eq(c.res[0]._id, 1);
    assert.eq(c.res[0].x, 1);
});

// Be sure $graphLookup is banned on sharded foreign collection when the feature flag is disabled
// and allowed when it is enabled.
assert.commandWorked(st.s0.adminCommand({shardCollection: "test.baz", key: {_id: "hashed"}}));
assert.commandWorked(db.baz.insert({_id: 1, x: 1}));

const getShardedLookupParam = st.s.adminCommand({getParameter: 1, featureFlagShardedLookup: 1});
const isShardedLookupEnabled = getShardedLookupParam.hasOwnProperty("featureFlagShardedLookup") &&
    getShardedLookupParam.featureFlagShardedLookup.value;

if (isShardedLookupEnabled) {
    const res = db.foo
                    .aggregate([{
                        $graphLookup: {
                            from: "bar",
                            startWith: {$literal: 1},
                            connectFromField: "x",
                            connectToField: "_id",
                            as: "res"
                        }
                    }])
                    .toArray();

    assert.eq(res.length, 4);
    res.forEach(function(c) {
        assert.eq(c.res.length, 1);
        assert.eq(c.res[0]._id, 1);
        assert.eq(c.res[0].x, 1);
    });
} else {
    assert.throwsWithCode(() => db.foo.aggregate([{
            $graphLookup: {
                from: "baz",
                startWith: {$literal: 1},
                connectFromField: "x",
                connectToField: "_id",
                as: "res"
            }
        }]), 28769);
}
st.stop();
})();
