/**
   * When key attribute is used, fields can be shared between objects.
   *
   * @throws Exception
   */
  @Test(groups = "session")
  public void sharedKeyAttibute() throws Exception {
    MockHttpSessionWithEvent session = new MockHttpSessionWithEvent(context);

    // Set person.
    {
      MockRoundtrip trip = new MockRoundtrip(context, FirstKeyActionBean.class, session);
      trip.setParameter("person.firstName", "Christian");
      trip.setParameter("person.lastName", "Poitras");
      trip.execute();

      FirstKeyActionBean bean = trip.getActionBean(FirstKeyActionBean.class);
      Assert.assertEquals("Christian", bean.getPerson().getFirstName());
      Assert.assertEquals("Poitras", bean.getPerson().getLastName());
    }
    // Check is person is accessible from second action bean.
    {
      MockRoundtrip trip = new MockRoundtrip(context, SecondKeyActionBean.class, session);
      trip.execute();

      SecondKeyActionBean bean = trip.getActionBean(SecondKeyActionBean.class);
      Assert.assertEquals("Christian", bean.getPerson().getFirstName());
      Assert.assertEquals("Poitras", bean.getPerson().getLastName());
    }
  }
  /**
   * Test removal of object from session when event set it to null.
   *
   * @throws Exception
   */
  @Test(groups = "session")
  public void removeNull() throws Exception {
    MockHttpSessionWithEvent session = new MockHttpSessionWithEvent(context);

    String personKey =
        FirstKeyActionBean.class
            .getDeclaredField("person")
            .getAnnotation(org.stripesstuff.plugin.session.Session.class)
            .key();

    // Set person.
    {
      MockRoundtrip trip = new MockRoundtrip(context, FirstKeyActionBean.class, session);
      trip.setParameter("person.firstName", "Christian");
      trip.setParameter("person.lastName", "Poitras");
      trip.execute();

      FirstKeyActionBean bean = trip.getActionBean(FirstKeyActionBean.class);
      Assert.assertEquals("Christian", bean.getPerson().getFirstName());
      Assert.assertEquals("Poitras", bean.getPerson().getLastName());
      // Person should be in session.
      Assert.assertNotNull(session.getAttribute(personKey));
    }
    // Remove person from session using action bean.
    {
      MockRoundtrip trip = new MockRoundtrip(context, FirstKeyActionBean.class, session);
      trip.execute("remove");
      // Person should not be in session.
      Assert.assertNull(session.getAttribute(personKey));
    }
  }
  /**
   * Test {@link SessionStoreInterceptor#getAttribute(javax.servlet.http.HttpSession, String)
   * SessionStoreInterceptor.get} to get object from session.
   *
   * @throws Exception
   */
  @Test(groups = "session")
  public void getAttibute() throws Exception {
    MockHttpSessionWithEvent session = new MockHttpSessionWithEvent(context);

    String personKey =
        FirstKeyActionBean.class
            .getDeclaredField("person")
            .getAnnotation(org.stripesstuff.plugin.session.Session.class)
            .key();

    // Set person.
    {
      MockRoundtrip trip = new MockRoundtrip(context, FirstKeyActionBean.class, session);
      trip.setParameter("person.firstName", "Christian");
      trip.setParameter("person.lastName", "Poitras");
      trip.execute();

      FirstKeyActionBean bean = trip.getActionBean(FirstKeyActionBean.class);
      Assert.assertEquals("Christian", bean.getPerson().getFirstName());
      Assert.assertEquals("Poitras", bean.getPerson().getLastName());
    }

    // Get person from Interceptor.
    // Test kept for compatibility reasons.
    @SuppressWarnings("deprecation")
    Object person = SessionStoreInterceptor.getAttribute(session, personKey);
    Assert.assertTrue(Person.class.isAssignableFrom(person.getClass()));
    Assert.assertEquals("Christian", ((Person) person).getFirstName());
    Assert.assertEquals("Poitras", ((Person) person).getLastName());

    // Compare with session content.
    Assert.assertTrue(Person.class.isAssignableFrom(session.getAttribute(personKey).getClass()));
    Assert.assertEquals("Christian", ((Person) session.getAttribute(personKey)).getFirstName());
    Assert.assertEquals("Poitras", ((Person) session.getAttribute(personKey)).getLastName());
  }