github.com/kaleido-io/firefly@v0.0.0-20210622132723-8b4b6aacb971/internal/orchestrator/data_query_test.go (about) 1 // Copyright © 2021 Kaleido, Inc. 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package orchestrator 18 19 import ( 20 "context" 21 "fmt" 22 "testing" 23 24 "github.com/kaleido-io/firefly/pkg/database" 25 "github.com/kaleido-io/firefly/pkg/fftypes" 26 "github.com/stretchr/testify/assert" 27 "github.com/stretchr/testify/mock" 28 ) 29 30 func TestGetNamespace(t *testing.T) { 31 or := newTestOrchestrator() 32 or.mdi.On("GetNamespace", mock.Anything, "ns1").Return(nil, nil) 33 _, err := or.GetNamespace(context.Background(), "ns1") 34 assert.NoError(t, err) 35 } 36 37 func TestGetTransactionByID(t *testing.T) { 38 or := newTestOrchestrator() 39 u := fftypes.NewUUID() 40 or.mdi.On("GetTransactionByID", mock.Anything, u).Return(nil, nil) 41 _, err := or.GetTransactionByID(context.Background(), "ns1", u.String()) 42 assert.NoError(t, err) 43 } 44 45 func TestGetTransactionByIDBadID(t *testing.T) { 46 or := newTestOrchestrator() 47 _, err := or.GetTransactionByID(context.Background(), "", "") 48 assert.Regexp(t, "FF10142", err) 49 } 50 51 func TestGetTransactionOperationsOk(t *testing.T) { 52 or := newTestOrchestrator() 53 or.mdi.On("GetOperations", mock.Anything, mock.Anything).Return([]*fftypes.Operation{}, nil) 54 _, err := or.GetTransactionOperations(context.Background(), "ns1", fftypes.NewUUID().String()) 55 assert.NoError(t, err) 56 } 57 58 func TestGetTransactionOperationBadID(t *testing.T) { 59 or := newTestOrchestrator() 60 or.mdi.On("GetOperations", mock.Anything, mock.Anything).Return([]*fftypes.Operation{}, nil) 61 _, err := or.GetTransactionOperations(context.Background(), "ns1", "") 62 assert.Regexp(t, "FF10142", err) 63 } 64 65 func TestGetNamespaces(t *testing.T) { 66 or := newTestOrchestrator() 67 or.mdi.On("GetNamespaces", mock.Anything, mock.Anything).Return([]*fftypes.Namespace{}, nil) 68 fb := database.NamespaceQueryFactory.NewFilter(context.Background()) 69 f := fb.And(fb.Eq("name", "ns1")) 70 _, err := or.GetNamespaces(context.Background(), f) 71 assert.NoError(t, err) 72 } 73 74 func TestGetTransactions(t *testing.T) { 75 or := newTestOrchestrator() 76 u := fftypes.NewUUID() 77 or.mdi.On("GetTransactions", mock.Anything, mock.Anything).Return([]*fftypes.Transaction{}, nil) 78 fb := database.TransactionQueryFactory.NewFilter(context.Background()) 79 f := fb.And(fb.Eq("id", u)) 80 _, err := or.GetTransactions(context.Background(), "ns1", f) 81 assert.NoError(t, err) 82 } 83 84 func TestGetMessageByIDBadID(t *testing.T) { 85 or := newTestOrchestrator() 86 _, err := or.GetMessageByID(context.Background(), "", "", false) 87 assert.Regexp(t, "FF10142", err) 88 } 89 90 func TestGetMessageByIDOkNoValues(t *testing.T) { 91 or := newTestOrchestrator() 92 msgID := fftypes.NewUUID() 93 msg := &fftypes.Message{ 94 Header: fftypes.MessageHeader{ 95 ID: msgID, 96 }, 97 Data: fftypes.DataRefs{ 98 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 99 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 100 }, 101 } 102 or.mdi.On("GetMessageByID", mock.Anything, mock.MatchedBy(func(u *fftypes.UUID) bool { return u.Equals(msgID) })).Return(msg, nil) 103 104 msgI, err := or.GetMessageByID(context.Background(), "ns1", msgID.String(), false) 105 assert.NoError(t, err) 106 assert.NotNil(t, msgI.InputData[0].ID) 107 assert.NotNil(t, msgI.InputData[0].Hash) 108 assert.Nil(t, msgI.InputData[0].Value) 109 assert.NotNil(t, msgI.InputData[1].ID) 110 assert.NotNil(t, msgI.InputData[1].Hash) 111 assert.Nil(t, msgI.InputData[1].Value) 112 } 113 114 func TestGetMessageByIDOkWithValues(t *testing.T) { 115 or := newTestOrchestrator() 116 msgID := fftypes.NewUUID() 117 msg := &fftypes.Message{ 118 Header: fftypes.MessageHeader{ 119 ID: msgID, 120 }, 121 Data: fftypes.DataRefs{ 122 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 123 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 124 }, 125 } 126 or.mdi.On("GetMessageByID", mock.Anything, mock.MatchedBy(func(u *fftypes.UUID) bool { return u.Equals(msgID) })).Return(msg, nil) 127 or.mdm.On("GetMessageData", mock.Anything, mock.Anything, true).Return([]*fftypes.Data{ 128 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32(), Value: fftypes.Byteable("{}")}, 129 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32(), Value: fftypes.Byteable("{}")}, 130 }, true, nil) 131 132 msgI, err := or.GetMessageByID(context.Background(), "ns1", msgID.String(), true) 133 assert.NoError(t, err) 134 assert.NotNil(t, msgI.InputData[0].ID) 135 assert.NotNil(t, msgI.InputData[0].Hash) 136 assert.NotNil(t, msgI.InputData[0].Value) 137 assert.NotNil(t, msgI.InputData[1].ID) 138 assert.NotNil(t, msgI.InputData[1].Hash) 139 assert.NotNil(t, msgI.InputData[1].Value) 140 } 141 142 func TestGetMessageByIDValuesFail(t *testing.T) { 143 or := newTestOrchestrator() 144 msgID := fftypes.NewUUID() 145 msg := &fftypes.Message{ 146 Header: fftypes.MessageHeader{ 147 ID: msgID, 148 }, 149 Data: fftypes.DataRefs{ 150 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 151 {ID: fftypes.NewUUID(), Hash: fftypes.NewRandB32()}, 152 }, 153 } 154 or.mdi.On("GetMessageByID", mock.Anything, mock.Anything).Return(msg, nil) 155 or.mdm.On("GetMessageData", mock.Anything, mock.Anything, true).Return(nil, false, fmt.Errorf("pop")) 156 157 _, err := or.GetMessageByID(context.Background(), "ns1", msgID.String(), true) 158 assert.EqualError(t, err, "pop") 159 } 160 func TestGetMessages(t *testing.T) { 161 or := newTestOrchestrator() 162 u := fftypes.NewUUID() 163 or.mdi.On("GetMessages", mock.Anything, mock.Anything).Return([]*fftypes.Message{}, nil) 164 fb := database.MessageQueryFactory.NewFilter(context.Background()) 165 f := fb.And(fb.Eq("id", u)) 166 _, err := or.GetMessages(context.Background(), "ns1", f) 167 assert.NoError(t, err) 168 } 169 170 func TestGetMessagesForData(t *testing.T) { 171 or := newTestOrchestrator() 172 u := fftypes.NewUUID() 173 or.mdi.On("GetMessagesForData", mock.Anything, u, mock.Anything).Return([]*fftypes.Message{}, nil) 174 fb := database.MessageQueryFactory.NewFilter(context.Background()) 175 f := fb.And(fb.Eq("id", u)) 176 _, err := or.GetMessagesForData(context.Background(), "ns1", u.String(), f) 177 assert.NoError(t, err) 178 } 179 180 func TestGetMessagesForDataBadID(t *testing.T) { 181 or := newTestOrchestrator() 182 f := database.MessageQueryFactory.NewFilter(context.Background()).And() 183 _, err := or.GetMessagesForData(context.Background(), "!wrong", "!bad", f) 184 assert.Regexp(t, "FF10142", err) 185 } 186 187 func TestGetMessageTransactionOk(t *testing.T) { 188 or := newTestOrchestrator() 189 msgID := fftypes.NewUUID() 190 batchID := fftypes.NewUUID() 191 txID := fftypes.NewUUID() 192 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 193 BatchID: batchID, 194 Header: fftypes.MessageHeader{ 195 TxType: fftypes.TransactionTypeBatchPin, 196 }, 197 }, nil) 198 or.mdi.On("GetBatchByID", mock.Anything, uuidMatches(batchID)).Return(&fftypes.Batch{ 199 Payload: fftypes.BatchPayload{ 200 TX: fftypes.TransactionRef{ 201 Type: fftypes.TransactionTypeBatchPin, 202 ID: txID, 203 }, 204 }, 205 }, nil) 206 or.mdi.On("GetTransactionByID", mock.Anything, uuidMatches(txID)).Return(&fftypes.Transaction{ 207 ID: txID, 208 }, nil) 209 tx, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 210 assert.NoError(t, err) 211 assert.Equal(t, *txID, *tx.ID) 212 or.mdi.AssertExpectations(t) 213 } 214 215 func TestGetMessageTransactionOperations(t *testing.T) { 216 or := newTestOrchestrator() 217 msgID := fftypes.NewUUID() 218 batchID := fftypes.NewUUID() 219 txID := fftypes.NewUUID() 220 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 221 BatchID: batchID, 222 Header: fftypes.MessageHeader{ 223 TxType: fftypes.TransactionTypeBatchPin, 224 }, 225 }, nil) 226 or.mdi.On("GetBatchByID", mock.Anything, uuidMatches(batchID)).Return(&fftypes.Batch{ 227 Payload: fftypes.BatchPayload{ 228 TX: fftypes.TransactionRef{ 229 Type: fftypes.TransactionTypeBatchPin, 230 ID: txID, 231 }, 232 }, 233 }, nil) 234 or.mdi.On("GetOperations", mock.Anything, mock.Anything).Return([]*fftypes.Operation{}, nil) 235 ops, err := or.GetMessageOperations(context.Background(), "ns1", msgID.String()) 236 assert.NoError(t, err) 237 assert.Len(t, ops, 0) 238 or.mdi.AssertExpectations(t) 239 } 240 241 func TestGetMessageTransactionOperationsNoTX(t *testing.T) { 242 or := newTestOrchestrator() 243 msgID := fftypes.NewUUID() 244 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{}, nil) 245 _, err := or.GetMessageOperations(context.Background(), "ns1", msgID.String()) 246 assert.Regexp(t, "FF10207", err) 247 or.mdi.AssertExpectations(t) 248 } 249 250 func TestGetMessageTransactionNoBatchTX(t *testing.T) { 251 or := newTestOrchestrator() 252 msgID := fftypes.NewUUID() 253 batchID := fftypes.NewUUID() 254 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 255 BatchID: batchID, 256 Header: fftypes.MessageHeader{ 257 TxType: fftypes.TransactionTypeBatchPin, 258 }, 259 }, nil) 260 or.mdi.On("GetBatchByID", mock.Anything, uuidMatches(batchID)).Return(&fftypes.Batch{}, nil) 261 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 262 assert.Regexp(t, "FF10210", err) 263 } 264 265 func TestGetMessageTransactionNoBatch(t *testing.T) { 266 or := newTestOrchestrator() 267 msgID := fftypes.NewUUID() 268 batchID := fftypes.NewUUID() 269 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 270 BatchID: batchID, 271 Header: fftypes.MessageHeader{ 272 TxType: fftypes.TransactionTypeBatchPin, 273 }, 274 }, nil) 275 or.mdi.On("GetBatchByID", mock.Anything, uuidMatches(batchID)).Return(nil, nil) 276 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 277 assert.Regexp(t, "FF10209", err) 278 } 279 280 func TestGetMessageTransactionBatchLookupErr(t *testing.T) { 281 or := newTestOrchestrator() 282 msgID := fftypes.NewUUID() 283 batchID := fftypes.NewUUID() 284 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 285 BatchID: batchID, 286 Header: fftypes.MessageHeader{ 287 TxType: fftypes.TransactionTypeBatchPin, 288 }, 289 }, nil) 290 or.mdi.On("GetBatchByID", mock.Anything, uuidMatches(batchID)).Return(nil, fmt.Errorf("pop")) 291 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 292 assert.Regexp(t, "pop", err) 293 } 294 295 func TestGetMessageTransactionNoBatchID(t *testing.T) { 296 or := newTestOrchestrator() 297 msgID := fftypes.NewUUID() 298 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{ 299 Header: fftypes.MessageHeader{ 300 TxType: fftypes.TransactionTypeBatchPin, 301 }, 302 }, nil) 303 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 304 assert.Regexp(t, "FF10208", err) 305 } 306 307 func TestGetMessageTransactionNoTx(t *testing.T) { 308 or := newTestOrchestrator() 309 msgID := fftypes.NewUUID() 310 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(&fftypes.Message{}, nil) 311 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 312 assert.Regexp(t, "FF10207", err) 313 } 314 315 func TestGetMessageTransactionMessageNotFound(t *testing.T) { 316 or := newTestOrchestrator() 317 msgID := fftypes.NewUUID() 318 or.mdi.On("GetMessageByID", mock.Anything, uuidMatches(msgID)).Return(nil, nil) 319 _, err := or.GetMessageTransaction(context.Background(), "ns1", msgID.String()) 320 assert.Regexp(t, "FF10109", err) 321 } 322 323 func TestGetMessageData(t *testing.T) { 324 or := newTestOrchestrator() 325 msg := &fftypes.Message{ 326 Header: fftypes.MessageHeader{ 327 ID: fftypes.NewUUID(), 328 }, 329 Data: fftypes.DataRefs{ 330 {ID: fftypes.NewUUID()}, 331 {ID: fftypes.NewUUID()}, 332 }, 333 } 334 or.mdi.On("GetMessageByID", mock.Anything, mock.Anything).Return(msg, nil) 335 or.mdm.On("GetMessageData", mock.Anything, msg, true).Return([]*fftypes.Data{}, true, nil) 336 _, err := or.GetMessageData(context.Background(), "ns1", fftypes.NewUUID().String()) 337 assert.NoError(t, err) 338 } 339 340 func TestGetMessageDataBadMsg(t *testing.T) { 341 or := newTestOrchestrator() 342 or.mdi.On("GetMessageByID", mock.Anything, mock.Anything).Return(nil, nil) 343 _, err := or.GetMessageData(context.Background(), "ns1", fftypes.NewUUID().String()) 344 assert.Regexp(t, "FF10109", err) 345 } 346 347 func TestGetMessageEventsOk(t *testing.T) { 348 or := newTestOrchestrator() 349 msg := &fftypes.Message{ 350 Header: fftypes.MessageHeader{ 351 ID: fftypes.NewUUID(), 352 }, 353 Data: fftypes.DataRefs{ 354 {ID: fftypes.NewUUID()}, 355 {ID: fftypes.NewUUID()}, 356 }, 357 } 358 or.mdi.On("GetMessageByID", mock.Anything, mock.Anything).Return(msg, nil) 359 or.mdi.On("GetEvents", mock.Anything, mock.Anything).Return([]*fftypes.Event{}, nil) 360 fb := database.EventQueryFactory.NewFilter(context.Background()) 361 f := fb.And(fb.Eq("type", fftypes.EventTypeMessageConfirmed)) 362 _, err := or.GetMessageEvents(context.Background(), "ns1", fftypes.NewUUID().String(), f) 363 assert.NoError(t, err) 364 calculatedFilter, err := or.mdi.Calls[1].Arguments[1].(database.Filter).Finalize() 365 assert.NoError(t, err) 366 assert.Equal(t, fmt.Sprintf( 367 `( type == 'message_confirmed' ) && ( reference IN ['%s','%s','%s'] )`, 368 msg.Header.ID, msg.Data[0].ID, msg.Data[1].ID, 369 ), calculatedFilter.String()) 370 assert.NoError(t, err) 371 } 372 373 func TestGetMessageEventsBadMsgID(t *testing.T) { 374 or := newTestOrchestrator() 375 fb := database.EventQueryFactory.NewFilter(context.Background()) 376 f := fb.And(fb.Eq("type", fftypes.EventTypeMessageConfirmed)) 377 or.mdi.On("GetMessageByID", mock.Anything, mock.Anything).Return(nil, nil) 378 ev, err := or.GetMessageEvents(context.Background(), "ns1", fftypes.NewUUID().String(), f) 379 assert.Regexp(t, "FF10109", err) 380 assert.Nil(t, ev) 381 } 382 383 func TestGetBatchByID(t *testing.T) { 384 or := newTestOrchestrator() 385 u := fftypes.NewUUID() 386 or.mdi.On("GetBatchByID", mock.Anything, u).Return(nil, nil) 387 _, err := or.GetBatchByID(context.Background(), "ns1", u.String()) 388 assert.NoError(t, err) 389 } 390 391 func TestGetBatchByIDBadID(t *testing.T) { 392 or := newTestOrchestrator() 393 _, err := or.GetBatchByID(context.Background(), "", "") 394 assert.Regexp(t, "FF10142", err) 395 } 396 397 func TestGetBatches(t *testing.T) { 398 or := newTestOrchestrator() 399 u := fftypes.NewUUID() 400 or.mdi.On("GetBatches", mock.Anything, mock.Anything).Return([]*fftypes.Batch{}, nil) 401 fb := database.BatchQueryFactory.NewFilter(context.Background()) 402 f := fb.And(fb.Eq("id", u)) 403 _, err := or.GetBatches(context.Background(), "ns1", f) 404 assert.NoError(t, err) 405 } 406 407 func TestGetDataByID(t *testing.T) { 408 or := newTestOrchestrator() 409 u := fftypes.NewUUID() 410 or.mdi.On("GetDataByID", mock.Anything, u, true).Return(nil, nil) 411 _, err := or.GetDataByID(context.Background(), "ns1", u.String()) 412 assert.NoError(t, err) 413 } 414 415 func TestGetDataByIDBadID(t *testing.T) { 416 or := newTestOrchestrator() 417 _, err := or.GetDataByID(context.Background(), "", "") 418 assert.Regexp(t, "FF10142", err) 419 } 420 421 func TestGetData(t *testing.T) { 422 or := newTestOrchestrator() 423 u := fftypes.NewUUID() 424 or.mdi.On("GetData", mock.Anything, mock.Anything).Return([]*fftypes.Data{}, nil) 425 fb := database.DataQueryFactory.NewFilter(context.Background()) 426 f := fb.And(fb.Eq("id", u)) 427 _, err := or.GetData(context.Background(), "ns1", f) 428 assert.NoError(t, err) 429 } 430 431 func TestGetDataDefsByID(t *testing.T) { 432 or := newTestOrchestrator() 433 u := fftypes.NewUUID() 434 or.mdi.On("GetDatatypeByID", mock.Anything, u).Return(nil, nil) 435 _, err := or.GetDatatypeByID(context.Background(), "ns1", u.String()) 436 assert.NoError(t, err) 437 } 438 439 func TestGetDataDefsByIDBadID(t *testing.T) { 440 or := newTestOrchestrator() 441 _, err := or.GetDatatypeByID(context.Background(), "", "") 442 assert.Regexp(t, "FF10142", err) 443 } 444 445 func TestGetOperationByID(t *testing.T) { 446 or := newTestOrchestrator() 447 u := fftypes.NewUUID() 448 or.mdi.On("GetOperationByID", mock.Anything, u).Return(nil, nil) 449 _, err := or.GetOperationByID(context.Background(), "ns1", u.String()) 450 assert.NoError(t, err) 451 } 452 453 func TestGetOperationIDBadID(t *testing.T) { 454 or := newTestOrchestrator() 455 _, err := or.GetOperationByID(context.Background(), "", "") 456 assert.Regexp(t, "FF10142", err) 457 } 458 459 func TestGetEventByID(t *testing.T) { 460 or := newTestOrchestrator() 461 u := fftypes.NewUUID() 462 or.mdi.On("GetEventByID", mock.Anything, u).Return(nil, nil) 463 _, err := or.GetEventByID(context.Background(), "ns1", u.String()) 464 assert.NoError(t, err) 465 } 466 467 func TestGetEventIDBadID(t *testing.T) { 468 or := newTestOrchestrator() 469 _, err := or.GetEventByID(context.Background(), "", "") 470 assert.Regexp(t, "FF10142", err) 471 } 472 473 func TestGetDatatypes(t *testing.T) { 474 or := newTestOrchestrator() 475 u := fftypes.NewUUID() 476 or.mdi.On("GetDatatypes", mock.Anything, mock.Anything).Return([]*fftypes.Datatype{}, nil) 477 fb := database.DatatypeQueryFactory.NewFilter(context.Background()) 478 f := fb.And(fb.Eq("id", u)) 479 _, err := or.GetDatatypes(context.Background(), "ns1", f) 480 assert.NoError(t, err) 481 } 482 483 func TestGetOperations(t *testing.T) { 484 or := newTestOrchestrator() 485 u := fftypes.NewUUID() 486 or.mdi.On("GetOperations", mock.Anything, mock.Anything).Return([]*fftypes.Operation{}, nil) 487 fb := database.OperationQueryFactory.NewFilter(context.Background()) 488 f := fb.And(fb.Eq("id", u)) 489 _, err := or.GetOperations(context.Background(), "ns1", f) 490 assert.NoError(t, err) 491 } 492 493 func TestGetEvents(t *testing.T) { 494 or := newTestOrchestrator() 495 u := fftypes.NewUUID() 496 or.mdi.On("GetEvents", mock.Anything, mock.Anything).Return([]*fftypes.Event{}, nil) 497 fb := database.EventQueryFactory.NewFilter(context.Background()) 498 f := fb.And(fb.Eq("id", u)) 499 _, err := or.GetEvents(context.Background(), "ns1", f) 500 assert.NoError(t, err) 501 }