public void InserirManutencaoDeUmaParte()
        {
            var leitorConfiguracoes = new ConfigBancoDadosVariavelAmbienteTestes();
            var repositorio = new RepositorioEquipamentos(new MongoClient(leitorConfiguracoes.StringConexao), leitorConfiguracoes);
            var servico = new CriadorManutencao(repositorio, new FabricaManutencao());

            Extintor extintor = null;
            try
            {
                var siteId = Guid.NewGuid();
                extintor = new ConstrutorExtintor().NoSite(siteId).Construir();
                repositorio.Inserir(extintor);

                var nomeParteParaManutencao = extintor.ParametrosManutencao.Partes.First().Nome;
                servico.Criar(siteId, extintor.Id.ToString(), new ManutencaoDto { Data = DateTime.Now.ParaUnixTime(), Parte = nomeParteParaManutencao });

                var extintorAposAManutencao = repositorio.BuscarPorId(siteId, extintor.Id);

                extintorAposAManutencao.Manutencoes.Should().HaveCount(1);
                extintorAposAManutencao.Manutencoes.First().Parte.Should().Be(nomeParteParaManutencao);
            }
            finally
            {
                if (extintor != null)
                    repositorio.Remover(extintor.Id);
            }
        }
        public void LidarCorretamenteComHierarquiaDeEquipamentos()
        {
            var leitorConfiguracoes = new ConfigBancoDadosVariavelAmbienteTestes();
            var repositorio = new RepositorioEquipamentos(new MongoClient(leitorConfiguracoes.StringConexao), leitorConfiguracoes);

            Extintor extintor = null;
            Mangueira mangueira = null;
            SistemaContraIncendioEmCoifa sistemaContraIncendioEmCoifa = null;
            CentralAlarme centralAlarme = null;

            try
            {
                var siteId = Guid.NewGuid();
                extintor = new ConstrutorExtintor().NoSite(siteId).Construir();
                repositorio.Inserir(extintor);

                mangueira = new ConstrutorMangueira().NoSite(siteId).Construir();
                repositorio.Inserir(mangueira);

                sistemaContraIncendioEmCoifa = new ConstrutorSistemaContraIncendioEmCoifa().NoSite(siteId).Construir();
                repositorio.Inserir(sistemaContraIncendioEmCoifa);

                centralAlarme = new ConstrutorCentralAlarme().NoSite(siteId).Construir();
                repositorio.Inserir(centralAlarme);

                repositorio.BuscarPorId(siteId, extintor.Id).Tipo.Should().Be(TipoEquipamento.Extintor);
                repositorio.BuscarPorId(siteId, mangueira.Id).Tipo.Should().Be(TipoEquipamento.Mangueira);
                repositorio.BuscarPorId(siteId, sistemaContraIncendioEmCoifa.Id).Tipo.Should().Be(TipoEquipamento.SistemaContraIncendioEmCoifa);
                repositorio.BuscarPorId(siteId, centralAlarme.Id).Tipo.Should().Be(TipoEquipamento.CentralAlarme);
            }
            finally
            {
                if (extintor != null)
                    repositorio.Remover(extintor.Id);

                if (mangueira != null)
                    repositorio.Remover(mangueira.Id);

                if (sistemaContraIncendioEmCoifa != null)
                    repositorio.Remover(sistemaContraIncendioEmCoifa.Id);

                if (centralAlarme != null)
                    repositorio.Remover(centralAlarme.Id);
            }
        }
        public void RetornarSituacaoCorretaParaEquipamentoConformeDataDeReferencia() 
        {
            //Arrange
            var extintorParaCasosDeTeste = new ConstrutorExtintor()
                .ComManutencao(new DateTime(2015, 2, 15))
                .ComManutencao(new DateTime(2016, 2, 13))
                .Construir();

            var casosDeTestePorEquipamentoDataReferencia = new Dictionary<Tuple<Equipamento, DateTime, string>, SituacaoManutencao>
            {
                {
                    new Tuple<Equipamento, DateTime, string>(
                        new ConstrutorMangueira().Construir(), 
                        DateTime.Now,
                        "Equipamento (exceto extintor) sem nenhuma manutenção deve retornar inconclusivo"), SituacaoManutencao.Inconclusivo
                },

                {
                    new Tuple<Equipamento, DateTime, string>(
                        new ConstrutorExtintor().ComDataDeFabricacao(new DateTime(2016, 2, 13)).Construir(), 
                        new DateTime(2017,1,13),
                        "Equipamento sem nenhuma manutenção deve retornar 'estado crítico' conforme a data de fabricação"), SituacaoManutencao.EstadoCritico
                },

                {
                    new Tuple<Equipamento, DateTime, string>(
                        extintorParaCasosDeTeste, 
                        new DateTime(2017,1,13), 
                        "Equipamento mantido há 11 meses deve retornar 'estado crítico'"), SituacaoManutencao.EstadoCritico
                },

                {
                    new Tuple<Equipamento, DateTime, string>(
                        extintorParaCasosDeTeste, 
                        new DateTime(2017,2,1), 
                        "Equipamento mantido há mais de 12 meses deve retornar 'estado crítico'"), SituacaoManutencao.EstadoCritico
                },

                {
                    new Tuple<Equipamento, DateTime, string>(
                        extintorParaCasosDeTeste, 
                        new DateTime(2016,12,14), 
                        "Equipamento mantido há mais de 10 meses deve retornar 'estado de atenção'"), SituacaoManutencao.EstadoDeAtencao
                },

                {
                    new Tuple<Equipamento, DateTime, string>(
                        extintorParaCasosDeTeste, 
                        new DateTime(2016,12,31), 
                        "Equipamento mantido há mais de 11 meses deve retornar 'estado de atenção'"), SituacaoManutencao.EstadoDeAtencao
                }

            };

            foreach (var caso in casosDeTestePorEquipamentoDataReferencia)
            {
                var equipamento = caso.Key.Item1;
                var dataReferenciaParaCalculoSituacao = caso.Key.Item2;
                var descricaoCasoDeTeste = caso.Key.Item3;
                var situacaoEsperada = caso.Value;

                //Action
                var situacaoCalculada = new CalculadoraSituacaoManutencao()
                    .Calcular(equipamento, dataReferenciaParaCalculoSituacao.ParaUnixTime());

                //Asserts
                situacaoCalculada.Should().Be(situacaoEsperada, descricaoCasoDeTeste);
            }
        }