// Copyright (C) MongoDB, Inc. 2024-present. // // Licensed under the Apache License, Version 2.0 (the "License"); you may // not use this file except in compliance with the License. You may obtain // a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 package mongo import ( "testing" "go.mongodb.org/mongo-driver/v2/bson" "go.mongodb.org/mongo-driver/v2/internal/assert" "go.mongodb.org/mongo-driver/v2/internal/require" ) func TestBatches(t *testing.T) { t.Parallel() batches := &modelBatches{ writePairs: make([]clientBulkWritePair, 2), } batches.AdvanceBatches(3) size := batches.Size() assert.Equal(t, 0, size, "expected: %d, got: %d", 1, size) } func TestAppendBatchSequence(t *testing.T) { t.Parallel() newBatches := func(t *testing.T) *modelBatches { client, err := newClient() require.NoError(t, err, "NewClient error: %v", err) return &modelBatches{ client: client, writePairs: []clientBulkWritePair{ {"ns0", nil}, {"ns1", &ClientInsertOneModel{ Document: bson.D{{"foo", 42}}, }}, {"ns2", &ClientReplaceOneModel{ Filter: bson.D{{"foo", "bar"}}, Replacement: bson.D{{"foo", "baz"}}, }}, {"ns1", &ClientDeleteOneModel{ Filter: bson.D{{"qux", "quux"}}, }}, }, offset: 1, result: &ClientBulkWriteResult{ Acknowledged: true, }, } } t.Run("test appendBatches", func(t *testing.T) { t.Parallel() batches := newBatches(t) const limitBigEnough = 16_000 n, _, err := batches.AppendBatchSequence(nil, 4, limitBigEnough) require.NoError(t, err, "AppendBatchSequence error: %v", err) require.Equal(t, 3, n, "expected %d appendings, got: %d", 3, n) _ = batches.cursorHandlers[0](&cursorInfo{Ok: true, Idx: 0}, nil) _ = batches.cursorHandlers[1](&cursorInfo{Ok: true, Idx: 1}, nil) _ = batches.cursorHandlers[2](&cursorInfo{Ok: true, Idx: 2}, nil) ins, ok := batches.result.InsertResults[1] assert.True(t, ok, "expected an insert results") assert.NotNil(t, ins.InsertedID, "expected an ID") _, ok = batches.result.UpdateResults[2] assert.True(t, ok, "expected an insert results") _, ok = batches.result.DeleteResults[3] assert.True(t, ok, "expected an delete results") }) t.Run("test appendBatches with maxCount", func(t *testing.T) { t.Parallel() batches := newBatches(t) const limitBigEnough = 16_000 n, _, err := batches.AppendBatchSequence(nil, 2, limitBigEnough) require.NoError(t, err, "AppendBatchSequence error: %v", err) require.Equal(t, 2, n, "expected %d appendings, got: %d", 2, n) _ = batches.cursorHandlers[0](&cursorInfo{Ok: true, Idx: 0}, nil) _ = batches.cursorHandlers[1](&cursorInfo{Ok: true, Idx: 1}, nil) ins, ok := batches.result.InsertResults[1] assert.True(t, ok, "expected an insert results") assert.NotNil(t, ins.InsertedID, "expected an ID") _, ok = batches.result.UpdateResults[2] assert.True(t, ok, "expected an insert results") _, ok = batches.result.DeleteResults[3] assert.False(t, ok, "expected an delete results") }) t.Run("test appendBatches with totalSize", func(t *testing.T) { t.Parallel() batches := newBatches(t) const limit = 1200 // > ( 166 first two batches + 1000 overhead ) n, _, err := batches.AppendBatchSequence(nil, 4, limit) require.NoError(t, err, "AppendBatchSequence error: %v", err) require.Equal(t, 2, n, "expected %d appendings, got: %d", 2, n) _ = batches.cursorHandlers[0](&cursorInfo{Ok: true, Idx: 0}, nil) _ = batches.cursorHandlers[1](&cursorInfo{Ok: true, Idx: 1}, nil) ins, ok := batches.result.InsertResults[1] assert.True(t, ok, "expected an insert results") assert.NotNil(t, ins.InsertedID, "expected an ID") _, ok = batches.result.UpdateResults[2] assert.True(t, ok, "expected an insert results") _, ok = batches.result.DeleteResults[3] assert.False(t, ok, "expected an delete results") }) }