org.jbb.security.impl.password.PasswordPolicyManagerTest.java Source code

Java tutorial

Introduction

Here is the source code for org.jbb.security.impl.password.PasswordPolicyManagerTest.java

Source

/*
 * Copyright (C) 2018 the original author or authors.
 *
 * This file is part of jBB Application Project.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0
 */

package org.jbb.security.impl.password;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import com.google.common.collect.Sets;
import javax.validation.ConstraintViolation;
import javax.validation.Validator;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.text.CharacterPredicates;
import org.apache.commons.text.RandomStringGenerator;
import org.jbb.security.api.password.PasswordException;
import org.jbb.security.api.password.PasswordPolicy;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class PasswordPolicyManagerTest {

    @Mock
    private PasswordProperties propertiesMock;

    @Mock
    private Validator validatorMock;

    @InjectMocks
    private PasswordPolicyManager passwordPolicyManager;

    @Test
    public void shouldReturnCurrentPasswordPolicy() {
        // when
        PasswordPolicy passwordPolicy = passwordPolicyManager.currentPolicy();

        // then
        assertThat(passwordPolicy).isNotNull();
    }

    @Test
    public void shouldInvokeValidationPolicy_whenUpdatePolicyPerformed() {
        // given
        PasswordPolicy passwordPolicy = new PasswordPolicy();
        passwordPolicy.setMinimumLength(4);
        passwordPolicy.setMaximumLength(16);

        // when
        passwordPolicyManager.update(passwordPolicy);

        // then
        verify(validatorMock).validate(eq(passwordPolicy));
    }

    @Test(expected = PasswordException.class)
    public void shouldThrowPasswordException_whenPolicyValidationFailed() {
        // given
        given(validatorMock.validate(any())).willReturn(Sets.newHashSet(mock(ConstraintViolation.class)));

        // when
        passwordPolicyManager.update(mock(PasswordPolicy.class));

        // then
        // throw PasswordException
    }

    @Test
    public void shouldUpdateMinimumLengthProperty_whenMinLengthPassedThroughNewPolicy() {
        // given
        given(validatorMock.validate(any())).willReturn(Sets.newHashSet());

        PasswordPolicy passwordPolicy = PasswordPolicy.builder().minimumLength(6).maximumLength(16).build();

        // when
        passwordPolicyManager.update(passwordPolicy);

        // then
        verify(propertiesMock, times(1)).setProperty(eq(PasswordProperties.PSWD_MIN_LENGTH_KEY),
                eq(Integer.toString(6)));
    }

    @Test
    public void shouldUpdateMaximumLengthProperty_whenMaxLengthPassedThroughNewPolicy() {
        // given
        given(validatorMock.validate(any())).willReturn(Sets.newHashSet());

        PasswordPolicy policy = PasswordPolicy.builder().minimumLength(6).maximumLength(10).build();

        // when
        passwordPolicyManager.update(policy);

        // then
        verify(propertiesMock, times(1)).setProperty(eq(PasswordProperties.PSWD_MAX_LENGTH_KEY),
                eq(Integer.toString(10)));
    }

    @Test(expected = NullPointerException.class)
    public void shouldThrowNPE_whenNullPassword() {
        // when
        passwordPolicyManager.assertMeetCriteria(null);

        // then
        // throw NullPointerException
    }

    @Test
    public void shouldNotMeetCriteriaAnytime_whenEmptyPassword() {
        // given
        String emptyPassword = StringUtils.EMPTY;

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(emptyPassword);

        // then
        assertThat(meet).isFalse();
    }

    @Test
    public void shouldMeetCriteria_whenNoMinimumLength_andOneCharLongPassword() {
        // given
        String password = "a";
        given(propertiesMock.passwordMinimumLength()).willReturn(1);
        given(propertiesMock.passwordMaximumLength()).willReturn(Integer.MAX_VALUE);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldNotMeetCriteria_whenMinimumLengthIsSix_andFiveCharactersLongPassword() {
        // given
        String password = "12345";
        given(propertiesMock.passwordMinimumLength()).willReturn(6);
        given(propertiesMock.passwordMaximumLength()).willReturn(Integer.MAX_VALUE);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isFalse();
    }

    @Test
    public void shouldMeetCriteria_whenMinimumLengthIsSix_andSixCharactersLongPassword() {
        // given
        String password = "123456";
        given(propertiesMock.passwordMinimumLength()).willReturn(6);
        given(propertiesMock.passwordMaximumLength()).willReturn(Integer.MAX_VALUE);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldMeetCriteria_whenMinimumLengthIsSix_andSevenCharactersLongPassword() {
        // given
        String password = "1234567";
        given(propertiesMock.passwordMinimumLength()).willReturn(6);
        given(propertiesMock.passwordMaximumLength()).willReturn(Integer.MAX_VALUE);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldNotMeetCriteria_whenMaximumLengthIsNine_andTenCharactersLongPassword() {
        // given
        String password = "1234567890";
        given(propertiesMock.passwordMinimumLength()).willReturn(1);
        given(propertiesMock.passwordMaximumLength()).willReturn(9);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isFalse();
    }

    @Test
    public void shouldNotMeetCriteria_whenMaximumLengthIsNine_andNineCharactersLongPassword() {
        // given
        String password = "123456789";
        given(propertiesMock.passwordMinimumLength()).willReturn(1);
        given(propertiesMock.passwordMaximumLength()).willReturn(9);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldNotMeetCriteria_whenMaximumLengthIsNine_andEightCharactersLongPassword() {
        // given
        String password = "12345678";
        given(propertiesMock.passwordMinimumLength()).willReturn(1);
        given(propertiesMock.passwordMaximumLength()).willReturn(9);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldNotMeetCriteria_whenMinimumLengthIsSeven_andMaximumLengthIsSeven_andSixCharactersLongPassword() {
        // given
        String password = "123456";
        given(propertiesMock.passwordMinimumLength()).willReturn(7);
        given(propertiesMock.passwordMaximumLength()).willReturn(7);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isFalse();
    }

    @Test
    public void shouldMeetCriteria_whenMinimumLengthIsSeven_andMaximumLengthIsSeven_andSevenCharactersLongPassword() {
        // given
        String password = "1234567";
        given(propertiesMock.passwordMinimumLength()).willReturn(7);
        given(propertiesMock.passwordMaximumLength()).willReturn(7);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }

    @Test
    public void shouldNotMeetCriteria_whenMinimumLengthIsSeven_andMaximumLengthIsSeven_andEightCharactersLongPassword() {
        // given
        String password = "12345678";
        given(propertiesMock.passwordMinimumLength()).willReturn(7);
        given(propertiesMock.passwordMaximumLength()).willReturn(7);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isFalse();
    }

    @Test
    public void shouldMeetCriteria_whenNoMaximumLength_andReallyLongPassword() {
        // given
        RandomStringGenerator randomStringGenerator = new RandomStringGenerator.Builder()
                .filteredBy(CharacterPredicates.LETTERS).build();
        String password = randomStringGenerator.generate(10000);
        given(propertiesMock.passwordMinimumLength()).willReturn(1);
        given(propertiesMock.passwordMaximumLength()).willReturn(Integer.MAX_VALUE);

        // when
        boolean meet = passwordPolicyManager.assertMeetCriteria(password);

        // then
        assertThat(meet).isTrue();
    }
}