@Test
  public void shouldFetchFacilitiesGivenAListOfMRSFacilityIds() {
    final MRSFacility anyFacility1 =
        new MRSFacility("1", "name", "country", "region", "district", "province");
    final MRSFacility anyFacility2 =
        new MRSFacility("2", "name", "country", "region", "district", "province");
    final MRSFacility anyFacility3 =
        new MRSFacility("3", "name", "country", "region", "district", "province");
    final MRSFacility anyFacility4 =
        new MRSFacility("4", "name", "country", "region", "district", "province");
    final Facility facility1 =
        new Facility(new MRSFacility("1", "name1", "country", "region", "district", "province"));
    final Facility facility2 =
        new Facility(new MRSFacility("2", "name2", "country", "region", "district", "province"));
    final Facility facility3 =
        new Facility(new MRSFacility("3", "name3", "country", "region", "district", "province"));
    final Facility facility4 =
        new Facility(new MRSFacility("4", "name4", "country", "region", "district", "province"));
    when(mockMrsFacilityAdaptor.saveFacility(facility1.mrsFacility())).thenReturn(anyFacility1);
    when(mockMrsFacilityAdaptor.saveFacility(facility2.mrsFacility())).thenReturn(anyFacility2);
    when(mockMrsFacilityAdaptor.saveFacility(facility3.mrsFacility())).thenReturn(anyFacility3);
    when(mockMrsFacilityAdaptor.saveFacility(facility4.mrsFacility())).thenReturn(anyFacility4);
    allFacilities.add(facility1);
    allFacilities.add(facility2);
    allFacilities.add(facility3);
    allFacilities.add(facility4);

    final List<Facility> byFacilityIds = allFacilities.findByFacilityIds(Arrays.asList("1", "2"));
    assertThat(byFacilityIds.size(), is(2));
  }
  @Test
  public void shouldGetAllFacilitiesByName() {
    final String facilityName = "name";
    final String country = "country";
    final String region = "region";
    final String district = "district";
    final String province = "province";
    final String phoneNumber = "0123456789";
    final String mrsFacilityId = "12";

    final MRSFacility mrsFacility =
        new MRSFacility(mrsFacilityId, facilityName, country, region, district, province);
    Facility facility = new Facility(mrsFacility).phoneNumber(phoneNumber);

    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility))
        .thenReturn(
            new MRSFacility(
                mrsFacilityId, facilityName, "country", "region", "district", "province"));
    allFacilities.add(facility);
    when(mockMrsFacilityAdaptor.getFacilities(facilityName)).thenReturn(Arrays.asList(mrsFacility));

    final List<Facility> actualFacilities = allFacilities.facilitiesByName(facilityName);

    final Facility actualFacility = actualFacilities.iterator().next();
    assertFacility(
        actualFacility, mrsFacilityId, facilityName, country, region, district, province);
    assertThat(actualFacility.phoneNumber(), is(equalTo(phoneNumber)));
  }
  @Test
  public void shouldSaveAFacility() throws Exception {
    final String facilityName = "name";
    final String phoneNumber = "0123456789";
    String additionalPhone1 = "12345";
    String additionalPhone2 = "321234";
    String additionalPhone3 = "33344";
    final MRSFacility mrsFacility = new MRSFacility(facilityName);
    Facility facility =
        facility(phoneNumber, additionalPhone1, additionalPhone2, additionalPhone3, mrsFacility);
    final int initialSize = allFacilities.getAll().size();

    final String facilityId = "12";
    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility))
        .thenReturn(
            new MRSFacility(facilityId, facilityName, "country", "region", "district", "province"));

    allFacilities.add(facility);

    final List<Facility> facilities = allFacilities.getAll();
    final int actualSize = facilities.size();
    final Facility actualFacility = facilities.iterator().next();
    assertThat(actualSize, is(equalTo(initialSize + 1)));
    assertThat(actualFacility.phoneNumber(), is(equalTo(phoneNumber)));
    assertThat(actualFacility.additionalPhoneNumber1(), is(equalTo(additionalPhone1)));
    assertThat(actualFacility.additionalPhoneNumber2(), is(equalTo(additionalPhone2)));
    assertThat(actualFacility.additionalPhoneNumber3(), is(equalTo(additionalPhone3)));
    assertThat(actualFacility.mrsFacilityId(), is(equalTo(facilityId)));
  }
  @Test
  public void shouldUpdateFacility() {
    final String facilityId = "16";
    final String facilityName = "name";
    final String phoneNumber = "0123456789";
    String additionalPhone1 = "12345";
    String additionalPhone2 = "321234";
    String additionalPhone3 = "33344";

    final String updatedFacilityName = "name";
    final String updatedPhoneNumber = "0123456789";
    String updatedAdditionalPhone1 = "12345";
    String updatedAdditionalPhone2 = "321234";
    String updatedAdditionalPhone3 = "33344";

    final MRSFacility mrsFacility = new MRSFacility(facilityName);
    Facility facility =
        facility(phoneNumber, additionalPhone1, additionalPhone2, additionalPhone3, mrsFacility);

    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility))
        .thenReturn(
            new MRSFacility(facilityId, facilityName, "country", "region", "district", "province"));
    allFacilities.add(facility);

    final MRSFacility updatedMRSFacility = new MRSFacility(updatedFacilityName);
    facility
        .phoneNumber(updatedPhoneNumber)
        .additionalPhoneNumber1(updatedAdditionalPhone1)
        .additionalPhoneNumber2(updatedAdditionalPhone2)
        .additionalPhoneNumber3(updatedAdditionalPhone3)
        .mrsFacility(updatedMRSFacility);

    allFacilities.update(facility);
  }
  @Test
  public void shouldGetFacilityByMrsFacilityId() {
    String facilityId = "0987654";
    String name = "name";
    String province = "province";
    String district = "district";
    String region = "region";
    String country = "country";

    final MRSFacility mrsFacility =
        new MRSFacility(facilityId, name, country, region, district, province);

    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility)).thenReturn(mrsFacility);
    allFacilities.add(facility("123460987", null, null, null, mrsFacility).motechId(facilityId));

    when(mockMrsFacilityAdaptor.getFacility(facilityId)).thenReturn(mrsFacility);

    Facility facility;
    assertFacility(
        allFacilities.getFacility(facilityId),
        facilityId,
        name,
        country,
        region,
        district,
        province);

    when(mockMrsFacilityAdaptor.getFacility(facilityId)).thenReturn(null);
    facility = allFacilities.getFacility(facilityId);
    assertThat(facility, is(equalTo(null)));
  }
  @Test
  public void shouldFindFacilityById() {
    String mrsFacilityId = "1234";
    String country = "Country";
    MRSFacility mrsFacility =
        new MRSFacility(mrsFacilityId, "facilityName", country, "Region", null, null);
    String phoneNumber = "9911002288";
    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility)).thenReturn(mrsFacility);
    allFacilities.add(facility(phoneNumber, null, null, null, mrsFacility));

    assertThat(allFacilities.findByMrsFacilityId(mrsFacilityId).phoneNumber(), is(phoneNumber));
  }
  @Test
  public void shouldFindFacilityByMotechId() {
    String motechFacilityId = "1346789";
    String mrsFacilityId = "100";
    MRSFacility mrsFacility = new MRSFacility(mrsFacilityId);
    when(mockMrsFacilityAdaptor.saveFacility(mrsFacility)).thenReturn(mrsFacility);
    allFacilities.add(
        facility("9911002288", null, null, null, mrsFacility).motechId(motechFacilityId));

    assertThat(
        allFacilities.findByMotechFacilityId(motechFacilityId).motechId(), is(motechFacilityId));
    assertThat(
        allFacilities.findByMotechFacilityId(motechFacilityId).mrsFacility(), is(equalTo(null)));
  }
  @Test
  public void shouldGetAllFacilities() {
    final String mrsFacilityId = "12345";
    final String facilityName = "name";
    final String country = "Utopia";
    final String region = "Region 1";
    final String district = "District 1";
    final String province = "Province 1";
    final MRSFacility facility =
        new MRSFacility(mrsFacilityId, facilityName, country, region, district, province);

    when(mockMrsFacilityAdaptor.saveFacility(facility))
        .thenReturn(
            new MRSFacility(mrsFacilityId, facilityName, country, region, district, province));
    allFacilities.add(new Facility(facility));

    when(mockMrsFacilityAdaptor.getFacilities()).thenReturn(Arrays.asList(facility));
    final List<Facility> actualFacilities = allFacilities.facilities();
    final Facility actualFacility = actualFacilities.iterator().next();
    assertThat(actualFacilities.size(), is(equalTo(1)));
    assertFacility(
        actualFacility, mrsFacilityId, facilityName, country, region, district, province);
  }