package com.cloudbees.plugins.credentials;

import com.cloudbees.plugins.credentials.common.UsernameCredentials;
import com.cloudbees.plugins.credentials.impl.BaseStandardCredentials;
import com.cloudbees.plugins.credentials.matchers.CQLSyntaxException;
import org.junit.Test;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

public class CredentialsMatchersTest {

    @Test
    public void describe() throws Exception {
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.always()), is("true"));
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.never()), is("false"));
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.withId("target=\"foo\"")), is("(id == \"target=\\\"foo\\\"\")"));
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.allOf(
                CredentialsMatchers.anyOf(
                        CredentialsMatchers.instanceOf(UsernameCredentials.class),
                        CredentialsMatchers.withScopes(CredentialsScope.GLOBAL, CredentialsScope.USER)
                ),
                CredentialsMatchers.not(CredentialsMatchers.withUsername("bob")))), is(
                "(((instanceof com.cloudbees.plugins.credentials.common.UsernameCredentials) "
                        + "|| ((scope == com.cloudbees.plugins.credentials.CredentialsScope.GLOBAL) "
                        + "|| (scope == com.cloudbees.plugins.credentials.CredentialsScope.USER))"
                        + ") && !(username == \"bob\"))"));
    }

    @Test
    public void parse() throws Exception {
        CredentialsMatcher matcher = CredentialsMatchers.allOf(
                CredentialsMatchers.anyOf(
                        CredentialsMatchers.instanceOf(UsernameCredentials.class),
                        CredentialsMatchers.withScopes(CredentialsScope.GLOBAL, CredentialsScope.USER)
                ),
                CredentialsMatchers.not(CredentialsMatchers.withUsername("bob")));
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.parse(CredentialsMatchers.describe(matcher))), is(CredentialsMatchers.describe(matcher)));
        matcher = CredentialsMatchers.allOf(
                CredentialsMatchers.anyOf(
                        CredentialsMatchers.withProperty("foo", 57.0),
                        CredentialsMatchers.withScopes(CredentialsScope.SYSTEM)
                ),
                CredentialsMatchers.not(CredentialsMatchers.withUsername("bob")));
        assertThat(CredentialsMatchers.describe(CredentialsMatchers.parse(CredentialsMatchers.describe(matcher))), is(CredentialsMatchers.describe(matcher)));
    }

    @Test
    public void parseTrue() throws Exception {
        assertThat(CredentialsMatchers.parse(CredentialsMatchers.describe(CredentialsMatchers.always())), is(CredentialsMatchers.always()));
    }

    @Test
    public void parsePropertyTest() throws Exception {
        CredentialsMatcher parsedMatcher =
                CredentialsMatchers.parse(CredentialsMatchers.describe(CredentialsMatchers.withUsername("b\tob")));
        assertThat(parsedMatcher.matches(new MyBaseStandardCredentials("b\tob")), is(true));
        assertThat(parsedMatcher.matches(new MyBaseStandardCredentials("bob")), is(false));
    }

    @Test(expected = CQLSyntaxException.class)
    public void parseInvalid() throws Exception {
        CredentialsMatchers.parse("\"bob\" == username");
    }

    @Test(expected = CQLSyntaxException.class)
    public void parseInvalid2() throws Exception {
        CredentialsMatchers.parse("id == \"id-1\" || \"id-2\"");
    }

    @Test(expected = CQLSyntaxException.class)
    public void parseInvalidMultiline() throws Exception {
        CredentialsMatchers.parse("id == \"id-1\"\n|| \"id-2\"\n&& instanceof Boolean");
    }

    @Test(expected = CQLSyntaxException.class)
    public void parseInvalid3() throws Exception {
        CredentialsMatchers.parse("id == 4foo");
    }

    @Test
    public void parseEmpty() throws Exception {
        assertThat(CredentialsMatchers.parse(""), is(CredentialsMatchers.always()));
    }

    @Test
    public void parseNegativePropertyTest() throws Exception {
        CredentialsMatcher parsedMatcher =
                CredentialsMatchers.parse(CredentialsMatchers.describe(CredentialsMatchers.not(CredentialsMatchers.withUsername("b\tob"))));
        assertThat(parsedMatcher.matches(new MyBaseStandardCredentials("b\tob")), is(false));
        assertThat(parsedMatcher.matches(new MyBaseStandardCredentials("bob")), is(true));
    }

    @Test
    public void beanMatcher() throws Exception {
        CredentialsMatcher instance = CredentialsMatchers.withProperty("username", "bob");
        assertThat(CredentialsMatchers.describe(instance), is("(username == \"bob\")"));
        assertThat(instance.matches(new MyBaseStandardCredentials("bob")), is(true));
        assertThat(instance.matches(new MyBaseStandardCredentials("ben")), is(false));
        assertThat(instance.matches(new BaseStandardCredentials(null, null) {}), is(false));
    }

    public static class MyBaseStandardCredentials extends BaseStandardCredentials {

        private final String username;

        public MyBaseStandardCredentials(String username) {
            super(null, null);
            this.username = username;
        }

        public String getUsername() {
            return username;
        }
    }
}

@@ -309,12 +309,25 @@
 cher
-s.is
+Assert.assertThat
 ;%0Aim
@@ -346,31 +346,28 @@
 org.
-junit.Assert.assertThat
+hamcrest.Matchers.is
 ;%0A%0Ap
@@ -3826,162 +3826,8 @@
  %7D%0A%0A
-    @Test(expected = CQLSyntaxException.class)%0A    public void parseInvalid3() throws Exception %7B%0A        CredentialsMatchers.parse(%22id == 4foo%22);%0A    %7D%0A%0A
     

Remove broken test