// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.baku.toolkit.blessings;

import android.app.Activity;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor;
import org.powermock.modules.junit4.PowerMockRunner;

import io.v.v23.security.Blessings;
import rx.functions.Action1;

import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("io.v.baku.toolkit.blessings.BlessingsUtils")
@PrepareForTest({Blessings.class, BlessingsUtils.class})
public class ActivityBlessingsSeekerTest {
    private static class MockActivityBlessingsSeeker extends ActivityBlessingsSeeker {
        public MockActivityBlessingsSeeker(final Activity activity) {
            super(activity, null, false);
        }

        @Override
        protected void seekBlessings() {
        }
    }

    @Before
    public void setUp() {
        mockStatic(BlessingsUtils.class);
    }

    @Test
    public void testColdPassive() {
        // would NPE if it tries to do anytyhing
        new MockActivityBlessingsSeeker(null)
                .getPassiveRxBlessings()
                .subscribe(b -> fail("Unexpected blessings " + b));
    }

    @Test
    public void testBlessingsFromManager() throws Exception {
        final Activity activity = mock(Activity.class);
        @SuppressWarnings("unchecked")
        final Action1<Blessings>
                cold = mock(Action1.class),
                hot = mock(Action1.class);
        final Blessings
                b1 = PowerMockito.mock(Blessings.class),
                b2 = PowerMockito.mock(Blessings.class);

        PowerMockito.when(BlessingsUtils.readSharedPrefs(any())).thenReturn(b1, b2);

        final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
        t.getPassiveRxBlessings().subscribe(cold);

        t.getRxBlessings().subscribe(hot);
        verify(hot).call(b1);
        verify(cold).call(b1);
        verify(hot, never()).call(b2);

        t.refreshBlessings();
        verify(hot).call(b2);
        verify(cold).call(b2);
    }

    @Test
    public void testBlessingsFromProvider() throws Exception {
        final Activity activity = mock(Activity.class);
        @SuppressWarnings("unchecked")
        final Action1<Blessings> s = mock(Action1.class);
        final Blessings
                b1 = PowerMockito.mock(Blessings.class),
                b2 = PowerMockito.mock(Blessings.class);

        final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
        t.getRxBlessings().subscribe(s);
        verify(s, never()).call(any());

        t.setBlessings(b1);
        verify(s).call(b1);

        t.refreshBlessings();
        // The mock BlessingsManager will default to null, so it will seek blessings again.
        t.setBlessings(b2);
        verify(s).call(b2);
    }

    /**
     * Verifies that if a new subscriber needs to seek blessings, the new subscriber does not
     * receive blessings until the seek completes (does not receive old blessings), and that the old
     * subscriber is refreshed as well.
     */
    @Test
    public void testDeferOnNewSubscriber() throws Exception {
        final Activity activity = mock(Activity.class);
        @SuppressWarnings("unchecked")
        final Action1<Blessings>
                s1 = mock(Action1.class),
                s2 = mock(Action1.class);
        final Blessings
                b1 = PowerMockito.mock(Blessings.class),
                b2 = PowerMockito.mock(Blessings.class);

        final MockActivityBlessingsSeeker t = new MockActivityBlessingsSeeker(activity);
        t.getRxBlessings().subscribe(s1);
        t.setBlessings(b1);

        t.getRxBlessings().subscribe(s2);
        verify(s2, never()).call(any());

        t.setBlessings(b2);
        verify(s1).call(b2);
        verify(s2).call(b2);
    }
}
