@Test
  public void do_switch_role_when_user_has_no_selected_role() throws Exception {
    user =
        new RichUserDetailsFactory()
            .addBodRoles(BodRole.createNewUser())
            .addUserGroup(new UserGroupFactory().setId("urn:user-group").create())
            .create();
    Security.setUserDetails(user);

    PhysicalResourceGroup pGroup = new PhysicalResourceGroupFactory().setActive(true).create();

    when(virtualResourceGroupServiceMock.findByAdminGroup("urn:user-group"))
        .thenReturn(Optional.empty());
    when(physicalResourceGroupServiceMock.find(2L)).thenReturn(Optional.of(pGroup));

    mockMvc
        .perform(
            post("/request")
                .param("physicalResourceGroupId", "2")
                .param("userGroupId", "urn:user-group")
                .param("bandwidth", "1111")
                .param("userLabel", "port")
                .param("message", "I want!"))
        .andExpect(view().name("redirect:/user"));

    assertThat(
        "Context should not be cleared",
        SecurityContextHolder.getContext().getAuthentication(),
        nullValue());

    verify(virtualResourceGroupServiceMock).save(any(VirtualResourceGroup.class));
    verify(virtualPortServiceMock)
        .requestCreateVirtualPort(eq(user), any(VirtualPortCreateRequestLink.class));
  }
  @Test
  public void should_not_create_form_if_physical_resource_group_does_not_exist() throws Exception {
    when(physicalResourceGroupServiceMock.find(1L)).thenReturn(Optional.empty());

    mockMvc
        .perform(get("/request").param("id", "1").param("teamUrn", "urn:group"))
        .andExpect(view().name("redirect:/virtualports/request"));
  }
  @Test
  public void should_not_create_form_if_physical_resource_group_is_not_active() throws Exception {
    PhysicalResourceGroup group = new PhysicalResourceGroupFactory().setActive(false).create();

    when(physicalResourceGroupServiceMock.find(1L)).thenReturn(Optional.of(group));

    mockMvc
        .perform(get("/request").param("id", "1").param("teamUrn", "urn:group"))
        .andExpect(view().name("redirect:/virtualports/request"));
  }
  @Test
  public void should_create_form_if_physical_resource_group_is_active() throws Exception {
    PhysicalResourceGroup group = new PhysicalResourceGroupFactory().setActive(true).create();

    when(physicalResourceGroupServiceMock.find(1L)).thenReturn(Optional.of(group));

    mockMvc
        .perform(get("/request").param("id", "1").param("teamUrn", "urn:user-group"))
        .andExpect(view().name("virtualports/requestform"))
        .andExpect(model().attributeExists("requestCommand", "user", "physicalResourceGroup"));
  }
  @Test
  public void when_the_physical_group_has_changed_dont_mail_and_redirect() throws Exception {
    when(physicalResourceGroupServiceMock.find(2L)).thenReturn(Optional.empty());

    mockMvc
        .perform(
            post("/request")
                .param("physicalResourceGroupId", "2")
                .param("userGroupId", "urn:user-group-wrong")
                .param("bandwidth", "1000")
                .param("userLabel", "new port")
                .param("message", "message"))
        .andExpect(view().name("redirect:/virtualports/request"));

    verifyNeverRequestNewVirtualPort();
  }
  @Test
  public void when_the_physical_resource_group_is_not_active_dont_mail_and_redirect()
      throws Exception {
    PhysicalResourceGroup group = new PhysicalResourceGroupFactory().setActive(false).create();

    when(physicalResourceGroupServiceMock.find(2L)).thenReturn(Optional.of(group));

    mockMvc
        .perform(
            post("/request")
                .param("physicalResourceGroupId", "2")
                .param("userGroupId", "urn:user-group")
                .param("bandwidth", "1000")
                .param("userLabel", "new port")
                .param("message", "message"))
        .andExpect(view().name("redirect:/virtualports/request"));

    verifyNeverRequestNewVirtualPort();
  }
  @Test
  public void when_virtual_resource_group_does_not_exists_it_should_be_created() throws Exception {
    PhysicalResourceGroup pGroup = new PhysicalResourceGroupFactory().setActive(true).create();

    when(virtualResourceGroupServiceMock.findByAdminGroup("urn:user-group"))
        .thenReturn(Optional.empty());
    when(physicalResourceGroupServiceMock.find(2L)).thenReturn(Optional.of(pGroup));

    mockMvc
        .perform(
            post("/request")
                .param("physicalResourceGroupId", "2")
                .param("userGroupId", "urn:user-group")
                .param("bandwidth", "1111")
                .param("userLabel", "new port")
                .param("message", "I want!"))
        .andExpect(view().name("redirect:/user"));

    verify(virtualResourceGroupServiceMock).save(any(VirtualResourceGroup.class));
    verify(virtualPortServiceMock)
        .requestCreateVirtualPort(eq(user), any(VirtualPortCreateRequestLink.class));
  }
  @Test
  public void find_all_groups_should_be_sorted() throws Exception {
    PhysicalResourceGroup group1 =
        new PhysicalResourceGroupFactory()
            .setOrganization(new OrganizationFactory().setName("A").create())
            .create();
    PhysicalResourceGroup group2 =
        new PhysicalResourceGroupFactory()
            .setOrganization(new OrganizationFactory().setName("B").create())
            .create();
    PhysicalResourceGroup group3 =
        new PhysicalResourceGroupFactory()
            .setOrganization(new OrganizationFactory().setName("C").create())
            .create();

    when(physicalResourceGroupServiceMock.findAllWithPorts())
        .thenReturn(Lists.newArrayList(group3, group1, group2));

    mockMvc
        .perform(get("/request").param("teamLabel", "label").param("teamUrn", "urn:group"))
        .andExpect(model().attribute("physicalResourceGroups", contains(group1, group2, group3)));
  }
 /**
  * Puts all {@link PhysicalResourceGroup}s on the model, needed to relate a group to a {@link
  * UniPort}.
  *
  * @return Collection<PhysicalResourceGroup>
  */
 @ModelAttribute(PhysicalResourceGroupController.MODEL_KEY_LIST)
 public Collection<PhysicalResourceGroup> populatePhysicalResourceGroups() {
   return Orderings.prgNameOrdering().immutableSortedCopy(physicalResourceGroupService.findAll());
 }