/**
 * Copyright (c) 2013-2014, jcabi.com
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met: 1) Redistributions of source code must retain the above
 * copyright notice, this list of conditions and the following
 * disclaimer. 2) Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided
 * with the distribution. 3) Neither the name of the jcabi.com nor
 * the names of its contributors may be used to endorse or promote
 * products derived from this software without specific prior written
 * permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 */
package com.jcabi.github.mock;

import com.jcabi.github.Repo;
import com.jcabi.github.Repos;
import javax.json.Json;
import org.hamcrest.MatcherAssert;
import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

/**
 * Test case for {@link MkRepos}.
 * @author Yegor Bugayenko (yegor@tpc2.com)
 * @version $Id$
 * @checkstyle MultipleStringLiterals (500 lines)
 */
public final class MkReposTest {

    /**
     * Rule for checking thrown exception.
     * @checkstyle VisibilityModifier (3 lines)
     */
    @Rule
    public transient ExpectedException thrown = ExpectedException.none();

    /**
     * MkRepos can create a repo.
     * @throws Exception If some problem inside
     */
    @Test
    public void createsRepository() throws Exception {
        final Repos repos = new MkRepos(new MkStorage.InFile(), "jeff");
        final Repo repo = repos.create(
            Json.createObjectBuilder().add("name", "test").build()
        );
        MatcherAssert.assertThat(
            repo.coordinates(),
            Matchers.hasToString("jeff/test")
        );
    }

    /**
     * MkRepos can create a repo with details.
     * @throws Exception If some problem inside
     */
    @Test
    public void createsRepositoryWithDetails() throws Exception {
        final Repos repos = new MkRepos(new MkStorage.InFile(), "jeff");
        final Repo repo = repos.create(
            Json.createObjectBuilder()
                .add("name", "hello")
                .add("description", "my test repo")
                .build()
        );
        MatcherAssert.assertThat(
            new Repo.Smart(repo).description(),
            Matchers.startsWith("my test")
        );
    }

    /**
     * MkRepos can remove an existing repo.
     * @throws Exception If some problem inside
     */
    @Test
    public void removesRepo() throws Exception {
        final Repos repos = new MkRepos(new MkStorage.InFile(), "jeff");
        final Repo repo = repos.create(
            Json.createObjectBuilder()
                .add("name", "remove-me")
                .add("description", "This is to be deleted!")
                .build()
        );
        MatcherAssert.assertThat(
            repos.get(repo.coordinates()),
            Matchers.notNullValue()
        );
        repos.remove(repo.coordinates());
        this.thrown.expect(IllegalArgumentException.class);
        this.thrown.expectMessage("repository jeff/remove-me doesn't exist");
        repos.get(repo.coordinates());
    }

    /**
     * MkRepos can iterate repos.
     * @throws Exception if there is any error
     */
    @Test
    public void iterateRepos() throws Exception {
        final String since = "1";
        final Repos repos = new MkRepos(new MkStorage.InFile(), "jeff");
        repos.create(Json.createObjectBuilder().add("name", since).build());
        repos.create(Json.createObjectBuilder().add("name", "2").build());
        MatcherAssert.assertThat(
            repos.iterate(since),
            Matchers.<Repo>iterableWithSize(2)
        );
    }
}

@@ -2471,97 +2471,51 @@
 o = 
-r
+MkR
 epos
-.create(%0A            Json.createObjectBuilder().add(%22name%22, %22test%22).build()%0A        
+Test.repo(repos, %22test%22, %22test repo%22
 );%0A 
@@ -2933,184 +2933,55 @@
 o = 
-r
+MkR
 epos
-.create(%0A            Json.createObjectBuilder()%0A                .add(%22name%22, %22hello%22)%0A                .add(%22description%22, %22my test repo%22)%0A                .build()%0A        
+Test.repo(repos, %22hello%22, %22my test repo%22
 );%0A 
@@ -3392,198 +3392,69 @@
 o = 
-r
+MkR
 epos
-.create(%0A            Json.createObjectBuilder()%0A                .add(%22name%22, %22remove-me%22)%0A                .add(%22description%22, %22This is to be deleted!%22)%0A                .build()%0A        
+Test.repo(repos, %22remove-me%22, %22This is to be deleted!%22
 );%0A 
@@ -4050,36 +4050,35 @@
 rage.InFile(), %22
-jeff
+tom
 %22);%0A        repo
@@ -4077,74 +4077,47 @@
     
-r
+MkR
 epos
-.create(Json.createObjectBuilder().add(%22name%22, since).build()
+Test.repo(repos, since, %22repo 1%22
 );%0A 
@@ -4127,72 +4127,45 @@
     
-r
+MkR
 epos
-.create(Json.createObjectBuilder().add(%22name%22, %222%22).build()
+Test.repo(repos, %222%22, %22repo 2%22
 );%0A 
@@ -4294,11 +4294,525 @@
 );%0A    %7D
+%0A%0A    /**%0A     * Create and return Repo to test.%0A     * @param repos Repos%0A     * @param name Repo name%0A     * @param desc Repo description%0A     * @return Repo%0A     * @throws Exception if there is any error%0A     */%0A    private static Repo repo(final Repos repos, final String name,%0A        final String desc) throws Exception %7B%0A        return repos.create(%0A            Json.createObjectBuilder()%0A                .add(%22name%22, name)%0A                .add(%22description%22, desc)%0A                .build()%0A        );%0A    %7D
 %0A%7D%0A

add common method