	@Test
	public void testeCargaIndicadores() throws InterruptedException {


		
		Estado e = new Estado(ESTADO);
		estadoService.salvar(e);
		Municipio m1 = new Municipio("", MUNICIPIO1, e);
		Municipio m2 = new Municipio("", MUNICIPIO2, e);
		Municipio m3 = new Municipio("", MUNICIPIO3, e);
		municipioService.salvar(m1);
		municipioService.salvar(m2);
		municipioService.salvar(m3);
		Area area = new Area(1, AREA);
		areaService.salvar(area);

		DadosCargaIndicador dados = new DadosCargaIndicador();
		
		dados.setArea(AREA);
		dados.setFocoIndicador(FOCO_INDICADOR);
		dados.setGrupoIndicador(GRUPO_INDICADOR);
		dados.setIndicador(INDICADOR);
		
		List<LinhaCargaIndicador> dadosCarga = new ArrayList<>();

		dadosCarga.add(new LinhaCargaIndicador(MUNICIPIO1, ESTADO, 0.1f, ANO1));
		dadosCarga.add(new LinhaCargaIndicador(MUNICIPIO2_REAL, ESTADO, 0.2f, ANO1));
		dadosCarga.add(new LinhaCargaIndicador(MUNICIPIO3, ESTADO, 0.3f, ANO1));
		// dados deverão ser sobreescritos
		dadosCarga.add( new LinhaCargaIndicador(MUNICIPIO1, ESTADO, 0.5f, ANO1));
		// outro ano
		dadosCarga.add( new LinhaCargaIndicador(MUNICIPIO1, ESTADO, 0.1f, ANO2));
		dadosCarga.add( new LinhaCargaIndicador(MUNICIPIO3, ESTADO, 0.4f, ANO2));
		
		dados.setArea(AREA);
		dados.setIndicador(INDICADOR);
		dados.setFocoIndicador(FOCO_INDICADOR);
		dados.setGrupoIndicador(GRUPO_INDICADOR);
		dados.setLinhas(dadosCarga);
		
		cargaIndicadorController.carregaIndicadores(dados);
		// give some time because the method is async
		Thread.sleep(2000);
		
		FocoIndicador foco = focoIndicadorService.buscaPorNome(FOCO_INDICADOR);
		GrupoIndicador grupoIndicador = grupoIndicadorService.buscaPorNome(GRUPO_INDICADOR);
		Indicador indicador = indicadorService.buscaPorNome(INDICADOR);
		assertNotNull(foco);
		assertNotNull(grupoIndicador);
		assertNotNull(indicador);
		
		List<Indicador> todosIndicadores = indicadorService.todos();
		List<Indicador> indicadoresPorArea = indicadorService.buscaPorArea(area);
		assertEquals(1, todosIndicadores.size());	
		assertEquals(1, indicadoresPorArea.size());
		
		List<ValorIndicador> valores2011 = valorIndicadorService.buscaPorIndicadorEAno(indicador, ANO1);
		List<ValorIndicador> valores2012 = valorIndicadorService.buscaPorIndicadorEAno(indicador, ANO2);
		assertEquals(3, valores2011.size());
		assertEquals(2, valores2012.size());
		
		List<ValorIndicador> valoresMUN1 = valorIndicadorService.buscaPorIndicadorEMunicipio(indicador, m1);
		List<ValorIndicador> valoresMUN2 = valorIndicadorService.buscaPorIndicadorEMunicipio(indicador, m2);
		List<ValorIndicador> valoresMUNANO = valorIndicadorService.buscaPorAnoMunicipio(ANO1, m1);
		List<ValorIndicador> valoresMUNAREAANO = valorIndicadorService.buscaPorMuninipioAreaAno(m1, area, ANO1);
		List<ValorIndicador> valoresMUN = valorIndicadorService.buscaPorMunicipio(m1);
		List<ValorIndicador> valoresMUNAREA = valorIndicadorService.buscaPorMuninipioArea(m1, area);
		assertEquals(2, valoresMUN1.size());
		assertEquals(1, valoresMUN2.size());
		assertEquals(1, valoresMUNANO.size());
		assertEquals(1, valoresMUNAREAANO.size());
		assertEquals(2, valoresMUN.size());
		assertEquals(2, valoresMUNAREA.size());
		
		List<Long> municipioIds = Arrays.asList(m1.getId(), m2.getId()); 
		Set<Long> municipioIdsSet = new HashSet<>(municipioIds);
		List<ValorIndicador> valoresPorMunAno = valorIndicadorService.buscaPorAnoMunicipios(ANO1, municipioIdsSet);
		valoresPorMunAno.forEach(System.out::println);
		assertEquals(2, valoresPorMunAno.size());
		
		Map<Indicador, Double> mediaPorAno = valorIndicadorService.mediaPorAno(ANO2);
		Double media = mediaPorAno.entrySet().stream().filter(en -> en.getKey().getId() == indicador.getId()).findFirst().get().getValue();
		assertEquals(0.25, media, 0.00001);
		
	}