If_update_is_requested_with_primary_data_and_elastic_record_with_identical_primaryLink_record_is_indexed_with_existing_data()
        {
            // Arrange
            var archvieRecordId = "3457";
            var mutationId      = 6626;
            var ar = new ArchiveRecord
            {
                ArchiveRecordId = archvieRecordId, Metadata = new ArchiveRecordMetadata {
                    PrimaryDataLink = "Aip@DossierId"
                },
                Security = new ArchiveRecordSecurity {
                    MetadataAccessToken = new List <string> {
                        "Ö1"
                    }
                }
            };

            harvestManager.Setup(e => e.BuildArchiveRecord(archvieRecordId)).Returns(ar);
            var findResult = new FindArchiveRecordResponse
            {
                ArchiveRecordId = archvieRecordId, ElasticArchiveRecord = new ElasticArchiveRecord
                {
                    ArchiveRecordId = archvieRecordId, PrimaryDataLink = "Aip@DossierId", PrimaryData = new List <ElasticArchiveRecordPackage>
                    {
                        new ElasticArchiveRecordPackage {
                            FileCount = 5, PackageId = "controlPackageId"
                        }
                    }
                }
            };

            findArchiveRecordClient.Setup(e => e.Request(It.IsAny <FindArchiveRecordRequest>(), CancellationToken.None))
            .Returns(Task.FromResult(findResult));

            // Act
            await InputQueueSendEndpoint.Send <ISyncArchiveRecord>(new
            {
                ArchiveRecordId = archvieRecordId,
                MutationId      = mutationId,
                Action          = "UpDaTe"
            });

            // Wait for the results
            await syncArchiveRecordTask;
            var   context = await updateArchiveRecordTask;

            // Assert
            context.Message.ArchiveRecord.ArchiveRecordId.Should().Be(archvieRecordId);
            context.Message.ArchiveRecord.ElasticPrimaryData[0].FileCount.Should().Be(5);
            context.Message.ArchiveRecord.ElasticPrimaryData[0].PackageId.Should().Be("controlPackageId");
            context.Message.MutationId.Should().Be(mutationId);
        }
        public async Task If_update_is_requested_with_removed_primary_data_package_then_cache_is_deleted()
        {
            // Arrange
            var archvieRecordId = "3457";
            var mutationId      = 6626;
            var ar = new ArchiveRecord
            {
                ArchiveRecordId = archvieRecordId, Metadata = new ArchiveRecordMetadata {
                    PrimaryDataLink = null
                },
                Security = new ArchiveRecordSecurity {
                    MetadataAccessToken = new List <string> {
                        "Ö1"
                    }
                }
            };

            harvestManager.Setup(e => e.BuildArchiveRecord(archvieRecordId)).Returns(ar);
            var findResult = new FindArchiveRecordResponse
            {
                ArchiveRecordId      = archvieRecordId,
                ElasticArchiveRecord = new ElasticArchiveRecord {
                    ArchiveRecordId = archvieRecordId, PrimaryDataLink = "AIP@DossierId"
                }
            };

            findArchiveRecordClient.Setup(e => e.Request(It.IsAny <FindArchiveRecordRequest>(), CancellationToken.None))
            .Returns(Task.FromResult(findResult));

            // Act
            await InputQueueSendEndpoint.Send <ISyncArchiveRecord>(new
            {
                ArchiveRecordId = archvieRecordId,
                MutationId      = mutationId,
                Action          = "UpDaTe"
            });

            // Wait for the results
            await syncArchiveRecordTask;
            var   context  = await updateArchiveRecordTask;
            var   context2 = await removeFileFromCacheTask;

            // Assert
            context.Message.ArchiveRecord.ArchiveRecordId.Should().Be(archvieRecordId);
            context.Message.MutationId.Should().Be(mutationId);

            // Verify the delete cache method was called
            context2.Message.ArchiveRecordId.Should().Be(archvieRecordId);
        }
        public async Task If_update_is_requested_with_removed_primary_data_package_and_no_existing_elastic_record_normal_update_is_made()
        {
            // Arrange
            var archvieRecordId = "34527";
            var mutationId      = 66267;
            var ar = new ArchiveRecord
            {
                ArchiveRecordId = archvieRecordId, Metadata = new ArchiveRecordMetadata {
                    PrimaryDataLink = null
                },
                Security = new ArchiveRecordSecurity {
                    MetadataAccessToken = new List <string> {
                        "Ö1"
                    }
                }
            };

            harvestManager.Setup(e => e.BuildArchiveRecord(archvieRecordId)).Returns(ar);
            var findResult = new FindArchiveRecordResponse {
                ArchiveRecordId = archvieRecordId, ElasticArchiveRecord = null
            };

            findArchiveRecordClient.Setup(e => e.Request(It.IsAny <FindArchiveRecordRequest>(), CancellationToken.None))
            .Returns(Task.FromResult(findResult));

            // Act
            await InputQueueSendEndpoint.Send <ISyncArchiveRecord>(new
            {
                ArchiveRecordId = archvieRecordId,
                MutationId      = mutationId,
                Action          = "UpDaTe"
            });

            // Wait for the results
            await syncArchiveRecordTask;
            var   context = await updateArchiveRecordTask;

            // Assert
            context.Message.ArchiveRecord.ArchiveRecordId.Should().Be(archvieRecordId);
            context.Message.MutationId.Should().Be(mutationId);
        }
        public async Task If_update_is_requested_with_no_primary_data_index_is_updated()
        {
            // Arrange
            var archvieRecordId = "345";
            var mutationId      = 666;
            var ar = new ArchiveRecord
            {
                ArchiveRecordId = archvieRecordId, Metadata = new ArchiveRecordMetadata {
                    PrimaryDataLink = null
                },
                Security = new ArchiveRecordSecurity {
                    MetadataAccessToken = new List <string> {
                        "Ö1"
                    }
                }
            };

            harvestManager.Setup(e => e.BuildArchiveRecord(archvieRecordId)).Returns(ar);
            var findResult = new FindArchiveRecordResponse
            {
                ArchiveRecordId      = archvieRecordId,
                ElasticArchiveRecord = new ElasticArchiveRecord {
                    ArchiveRecordId = archvieRecordId, PrimaryDataLink = null
                }
            };
            var response = new Mock <Response <FindArchiveRecordResponse> >();

            response.Setup(r => r.Message).Returns(findResult);

            findArchiveRecordClient.Setup(e => e.GetResponse <FindArchiveRecordResponse>(It.IsAny <FindArchiveRecordRequest>(), It.IsAny <CancellationToken>(), It.IsAny <RequestTimeout>()))
            .Returns(Task.FromResult(response.Object));

            var harness  = new InMemoryTestHarness();
            var consumer = harness.Consumer(() => new SyncArchiveRecordConsumer(harvestManager.Object, findArchiveRecordClient.Object, cachedHarvesterSetting.Object));

            await harness.Start();

            try
            {
                // Act
                await harness.InputQueueSendEndpoint.Send <ISyncArchiveRecord>(new
                {
                    ArchiveRecordId = archvieRecordId,
                    MutationId      = mutationId,
                    Action          = "UpDaTe"
                });


                // did the endpoint consume the message
                Assert.That(await harness.Consumed.Any <ISyncArchiveRecord>());

                // did the actual consumer consume the message
                Assert.That(await consumer.Consumed.Any <ISyncArchiveRecord>());
                var message = harness.Consumed.Select <ISyncArchiveRecord>().FirstOrDefault();

                // was the update message sent
                Assert.That(await harness.Sent.Any <IUpdateArchiveRecord>());

                // Assert
                Assert.That(message != null);
                message.Context.Message.ArchiveRecordId.Should().Be(archvieRecordId);
                message.Context.Message.MutationId.Should().Be(mutationId);
            }
            finally
            {
                await harness.Stop();
            }
        }
        If_update_is_requested_with_primary_data_and_elastic_record_with_identical_primaryLink_record_but_reindex_is_enforced_package_metadata_is_appended()
        {
            // Arrange
            var archvieRecordId = "3457";
            var mutationId      = 6626;
            var ar = new ArchiveRecord
            {
                ArchiveRecordId = archvieRecordId, Metadata = new ArchiveRecordMetadata {
                    PrimaryDataLink = "Aip@DossierId"
                },
                Security = new ArchiveRecordSecurity {
                    MetadataAccessToken = new List <string> {
                        "Ö1"
                    }
                }
            };

            harvestManager.Setup(e => e.BuildArchiveRecord(archvieRecordId)).Returns(ar);
            cachedHarvesterSetting.Setup(s => s.EnableFullResync()).Returns(true);
            var findResult = new FindArchiveRecordResponse
            {
                ArchiveRecordId = archvieRecordId, ElasticArchiveRecord = new ElasticArchiveRecord
                {
                    ArchiveRecordId = archvieRecordId, PrimaryDataLink = "Aip@DossierId", PrimaryData = new List <ElasticArchiveRecordPackage>
                    {
                        new ElasticArchiveRecordPackage {
                            FileCount = 5, PackageId = "controlPackageId"
                        }
                    }
                }
            };
            var response = new Mock <Response <FindArchiveRecordResponse> >();

            response.Setup(r => r.Message).Returns(findResult);
            findArchiveRecordClient.Setup(e => e.GetResponse <FindArchiveRecordResponse>(It.IsAny <FindArchiveRecordRequest>(), It.IsAny <CancellationToken>(), It.IsAny <RequestTimeout>()))
            .Returns(Task.FromResult(response.Object));

            var harness  = new InMemoryTestHarness();
            var consumer = harness.Consumer(() => new SyncArchiveRecordConsumer(harvestManager.Object, findArchiveRecordClient.Object, cachedHarvesterSetting.Object));

            await harness.Start();

            try
            {
                // Act
                await harness.InputQueueSendEndpoint.Send <ISyncArchiveRecord>(new
                {
                    ArchiveRecordId = archvieRecordId,
                    MutationId      = mutationId,
                    Action          = "UpDaTe"
                });

                // did the endpoint consume the message
                Assert.That(await harness.Consumed.Any <ISyncArchiveRecord>());

                // did the actual consumer consume the message
                Assert.That(await consumer.Consumed.Any <ISyncArchiveRecord>());

                // was the update ArchiveRecord message sent
                Assert.That(await harness.Sent.Any <IArchiveRecordAppendPackageMetadata>());
                var message = harness.Sent.Select <IArchiveRecordAppendPackageMetadata>().FirstOrDefault();

                // Assert
                Assert.That(message != null);
                message.Context.Message.ArchiveRecord.ArchiveRecordId.Should().Be(archvieRecordId);
                message.Context.Message.MutationId.Should().Be(mutationId);
            }
            finally
            {
                await harness.Stop();
            }
        }