File: aggregate-let.yml

package info (click to toggle)
golang-mongodb-mongo-driver 1.8.4%2Bds1-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bookworm-backports
  • size: 18,520 kB
  • sloc: perl: 533; ansic: 491; python: 432; makefile: 187; sh: 72
file content (174 lines) | stat: -rw-r--r-- 5,759 bytes parent folder | download | duplicates (2)
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
description: "aggregate-let"

schemaVersion: "1.4"

createEntities:
  - client:
      id: &client0 client0
      observeEvents: [ commandStartedEvent ]
  - database:
      id: &database0 database0
      client: *client0
      databaseName: &database0Name crud-tests
  - collection:
      id: &collection0 collection0
      database: *database0
      collectionName: &collection0Name coll0
  - collection:
      id: &collection1 collection1
      database: *database0
      collectionName: &collection1Name coll1

initialData: &initialData
  - collectionName: *collection0Name
    databaseName: *database0Name
    documents:
      - { _id: 1 }
  - collectionName: *collection1Name
    databaseName: *database0Name
    documents: [ ]

tests:
  # TODO: Once SERVER-57403 is resolved, this test can be removed in favor of
  # the "dollar-prefixed $literal value" test below.
  - description: "Aggregate with let option"
    runOnRequirements:
      - minServerVersion: "5.0"
    operations:
      - name: aggregate
        object: *collection0
        arguments:
          pipeline: &pipeline0
            # $match takes a query expression, so $expr is necessary to utilize
            # an aggregate expression context and access "let" variables.
            - $match: { $expr: { $eq: ["$_id", "$$id"] } }
            - $project: { _id: 0, x: "$$x", y: "$$y", rand: "$$rand" }
          # Values in "let" must be constant or closed expressions that do not
          # depend on document values. This test demonstrates a basic constant
          # value, a value wrapped with $literal (to avoid expression parsing),
          # and a closed expression (e.g. $rand).
          let: &let0
            id: 1
            x: foo
            y: { $literal: "bar" }
            rand: { $rand: {} }
        expectResult:
          - { x: "foo", y: "bar", rand: { $$type: "double" } }
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                aggregate: *collection0Name
                pipeline: *pipeline0
                let: *let0

  - description: "Aggregate with let option and dollar-prefixed $literal value"
    runOnRequirements:
      - minServerVersion: "5.0"
        # TODO: Remove topology restrictions once SERVER-57403 is resolved
        topologies: ["single", "replicaset"]
    operations:
      - name: aggregate
        object: *collection0
        arguments:
          pipeline: &pipeline0
            # $match takes a query expression, so $expr is necessary to utilize
            # an aggregate expression context and access "let" variables.
            - $match: { $expr: { $eq: ["$_id", "$$id"] } }
            - $project: { _id: 0, x: "$$x", y: "$$y", rand: "$$rand" }
          # Values in "let" must be constant or closed expressions that do not
          # depend on document values. This test demonstrates a basic constant
          # value, a value wrapped with $literal (to avoid expression parsing),
          # and a closed expression (e.g. $rand).
          let: &let0
            id: 1
            x: foo
            y: { $literal: "$bar" }
            rand: { $rand: {} }
        expectResult:
          - { x: "foo", y: "$bar", rand: { $$type: "double" } }
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                aggregate: *collection0Name
                pipeline: *pipeline0
                let: *let0

  - description: "Aggregate with let option unsupported (server-side error)"
    runOnRequirements:
      - minServerVersion: "2.6.0"
        maxServerVersion: "4.4.99"
    operations:
      - name: aggregate
        object: *collection0
        arguments:
          pipeline: &pipeline1
            - $match: { _id: 1 }
          let: &let1
            x: foo
        expectError:
          # Older server versions may not report an error code, but the error
          # message is consistent between 2.6.x and 4.4.x server versions.
          errorContains: "unrecognized field 'let'"
          isClientError: false
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                aggregate: *collection0Name
                pipeline: *pipeline1
                let: *let1

  - description: "Aggregate to collection with let option"
    runOnRequirements:
      - minServerVersion: "5.0"
        serverless: "forbid"
    operations:
      - name: aggregate
        object: *collection0
        arguments:
          pipeline: &pipeline2
            - $match: { $expr: { $eq: ["$_id", "$$id"] } }
            - $project: { _id: 1 }
            - $out: *collection1Name
          let: &let2
            id: 1
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                aggregate: *collection0Name
                pipeline: *pipeline2
                let: *let2
    outcome:
      - collectionName: *collection1Name
        databaseName: *database0Name
        documents:
          - { _id: 1 }

  - description: "Aggregate to collection with let option unsupported (server-side error)"
    runOnRequirements:
      - minServerVersion: "2.6.0"
        maxServerVersion: "4.4.99"
    operations:
      - name: aggregate
        object: *collection0
        arguments:
          pipeline: *pipeline2
          let: *let2
        expectError:
          errorContains: "unrecognized field 'let'"
          isClientError: false
    expectEvents:
      - client: *client0
        events:
          - commandStartedEvent:
              command:
                aggregate: *collection0Name
                pipeline: *pipeline2
                let: *let2