1// Copyright (C) MongoDB, Inc. 2017-present.
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may
4// not use this file except in compliance with the License. You may obtain
5// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
6
7package mongo
8
9import (
10	"errors"
11	"testing"
12
13	"go.mongodb.org/mongo-driver/bson"
14	"go.mongodb.org/mongo-driver/internal/testutil/assert"
15)
16
17func TestSingleResult(t *testing.T) {
18	t.Run("Decode", func(t *testing.T) {
19		t.Run("decode twice", func(t *testing.T) {
20			// Test that Decode and DecodeBytes can be called more than once
21			c, err := newCursor(newTestBatchCursor(1, 1), bson.DefaultRegistry)
22			assert.Nil(t, err, "newCursor error: %v", err)
23
24			sr := &SingleResult{cur: c, reg: bson.DefaultRegistry}
25			var firstDecode, secondDecode bson.Raw
26			err = sr.Decode(&firstDecode)
27			assert.Nil(t, err, "Decode error: %v", err)
28			err = sr.Decode(&secondDecode)
29			assert.Nil(t, err, "Decode error: %v", err)
30
31			decodeBytes, err := sr.DecodeBytes()
32			assert.Nil(t, err, "DecodeBytes error: %v", err)
33
34			assert.Equal(t, firstDecode, secondDecode, "expected contents %v, got %v", firstDecode, secondDecode)
35			assert.Equal(t, firstDecode, decodeBytes, "expected contents %v, got %v", firstDecode, decodeBytes)
36		})
37		t.Run("decode with error", func(t *testing.T) {
38			r := []byte("foo")
39			sr := &SingleResult{rdr: r, err: errors.New("DecodeBytes error")}
40			res, err := sr.DecodeBytes()
41			resBytes := []byte(res)
42			assert.Equal(t, r, resBytes, "expected contents %v, got %v", r, resBytes)
43			assert.Equal(t, sr.err, err, "expected error %v, got %v", sr.err, err)
44		})
45	})
46
47	t.Run("Err", func(t *testing.T) {
48		sr := &SingleResult{}
49		assert.Equal(t, ErrNoDocuments, sr.Err(), "expected error %v, got %v", ErrNoDocuments, sr.Err())
50	})
51}
52