@Test
  public void testFindPetsByTags() throws Exception {
    Pet pet = createRandomPet();
    pet.setName("monster");
    pet.setStatus(Pet.StatusEnum.AVAILABLE);

    List<Tag> tags = new ArrayList<Tag>();
    Tag tag1 = new Tag();
    tag1.setName("friendly");
    tags.add(tag1);
    pet.setTags(tags);

    api.updatePet(pet);

    List<Pet> pets = api.findPetsByTags(Arrays.asList(new String[] {"friendly"}));
    assertNotNull(pets);

    boolean found = false;
    for (Pet fetched : pets) {
      if (fetched.getId().equals(pet.getId())) {
        found = true;
        break;
      }
    }
    assertTrue(found);
  }
  @Test
  public void testUploadFile() throws Exception {
    Pet pet = createRandomPet();
    api.addPet(pet);

    File file = new File("hello.txt");
    BufferedWriter writer = new BufferedWriter(new FileWriter(file));
    writer.write("Hello world!");
    writer.close();

    api.uploadFile(pet.getId(), "a test file", new File(file.getAbsolutePath()));
  }
  @Test
  public void testDeletePet() throws Exception {
    Pet pet = createRandomPet();
    api.addPet(pet);

    Pet fetched = api.getPetById(pet.getId());
    api.deletePet(fetched.getId(), null);

    try {
      fetched = api.getPetById(fetched.getId());
      fail("expected an error");
    } catch (ApiException e) {
      assertEquals(404, e.getCode());
    }
  }
  @Test
  public void testUpdatePet() throws Exception {
    Pet pet = createRandomPet();
    pet.setName("programmer");

    api.updatePet(pet);

    Pet fetched = api.getPetById(pet.getId());
    assertNotNull(fetched);
    assertEquals(pet.getId(), fetched.getId());
    assertNotNull(fetched.getCategory());
    assertEquals(fetched.getCategory().getName(), pet.getCategory().getName());
  }
  @Test
  public void testCreateAndGetPet() throws Exception {
    Pet pet = createRandomPet();
    api.addPet(pet);

    Pet fetched = api.getPetById(pet.getId());
    assertNotNull(fetched);
    assertEquals(pet.getId(), fetched.getId());
    assertNotNull(fetched.getCategory());
    assertEquals(fetched.getCategory().getName(), pet.getCategory().getName());
  }
  @Test
  public void testUpdatePetWithForm() throws Exception {
    Pet pet = createRandomPet();
    pet.setName("frank");
    api.addPet(pet);

    Pet fetched = api.getPetById(pet.getId());

    api.updatePetWithForm(fetched.getId(), "furt", null);
    Pet updated = api.getPetById(fetched.getId());

    assertEquals(updated.getName(), "furt");
  }
  private Pet createRandomPet() {
    Pet pet = new Pet();
    pet.setId(TestUtils.nextId());
    pet.setName("gorilla");

    Category category = new Category();
    category.setName("really-happy");

    pet.setCategory(category);
    pet.setStatus(Pet.StatusEnum.AVAILABLE);
    List<String> photos =
        Arrays.asList(new String[] {"http://foo.bar.com/1", "http://foo.bar.com/2"});
    pet.setPhotoUrls(photos);

    return pet;
  }
  @Test
  public void testFindPetsByStatus() throws Exception {
    Pet pet = createRandomPet();
    pet.setName("programmer");
    pet.setStatus(Pet.StatusEnum.AVAILABLE);

    api.updatePet(pet);

    List<Pet> pets = api.findPetsByStatus(Arrays.asList(new String[] {"available"}));
    assertNotNull(pets);

    boolean found = false;
    for (Pet fetched : pets) {
      if (fetched.getId().equals(pet.getId())) {
        found = true;
        break;
      }
    }

    assertTrue(found);
  }
  @Test
  public void testEqualsAndHashCode() {
    Pet pet1 = new Pet();
    Pet pet2 = new Pet();
    assertTrue(pet1.equals(pet2));
    assertTrue(pet2.equals(pet1));
    assertTrue(pet1.hashCode() == pet2.hashCode());
    assertTrue(pet1.equals(pet1));
    assertTrue(pet1.hashCode() == pet1.hashCode());

    pet2.setName("really-happy");
    pet2.setPhotoUrls(Arrays.asList(new String[] {"http://foo.bar.com/1", "http://foo.bar.com/2"}));
    assertFalse(pet1.equals(pet2));
    assertFalse(pet2.equals(pet1));
    assertFalse(pet1.hashCode() == (pet2.hashCode()));
    assertTrue(pet2.equals(pet2));
    assertTrue(pet2.hashCode() == pet2.hashCode());

    pet1.setName("really-happy");
    pet1.setPhotoUrls(Arrays.asList(new String[] {"http://foo.bar.com/1", "http://foo.bar.com/2"}));
    assertTrue(pet1.equals(pet2));
    assertTrue(pet2.equals(pet1));
    assertTrue(pet1.hashCode() == pet2.hashCode());
    assertTrue(pet1.equals(pet1));
    assertTrue(pet1.hashCode() == pet1.hashCode());
  }