@Override
    public Map<String, String> getProperties() {
        final List<String> properties = this.list(PROPERTIES_KEY);
        if(properties.isEmpty()) {
            return parent.getProperties();
        }
        return properties.stream().distinct().collect(Collectors.toMap(
                property -> StringUtils.contains(property, '=') ? StringUtils.substringBefore(property, '=') : property,
                property -> StringUtils.contains(property, '=') ? substitutor.replace(StringUtils.substringAfter(property, '=')) : StringUtils.EMPTY));
    }
@Test
    public void testProperties() {
        final Profile profile = new Profile(new TestProtocol(), new Deserializer<String>() {
            @Override
            public String stringForKey(final String key) {
                return null;
            }

            @Override
            public String objectForKey(final String key) {
                return null;
            }

            @Override
            public <L> List<L> listForKey(final String key) {
                return (List<L>) Collections.singletonList("quota.notification.url=https://www.gmx.net/produkte/cloud/speicher-erweitern/?mc=03962659");
            }

            @Override
            public Map<String, String> mapForKey(final String key) {
                return null;
            }

            @Override
            public boolean booleanForKey(final String key) {
                return false;
            }

            @Override
            public List<String> keys() {
                return null;
            }
        });
        assertTrue(profile.getProperties().containsKey("quota.notification.url"));
        assertEquals("https://www.gmx.net/produkte/cloud/speicher-erweitern/?mc=03962659",
            profile.getProperties().get("quota.notification.url"));
    }