import UserProfile from "@/components/UserProfile.vue";
import { mount, VueWrapper } from "@vue/test-utils";
import { message } from "ant-design-vue";
import store from "@/store";
jest.mock("ant-design-vue", () => ({
  message: {
    success: jest.fn(),
  },
}));
const mockedRoutes: string[] = [];
jest.mock("vue-router", () => ({
  useRouter: () => ({
    push: (path: string) => {
      mockedRoutes.push(path);
    },
  }),
}));
const mockComponent = {
  template: "<div><slot></slot></div>",
};
const dropdownComponent = {
  
  template: "<div><slot></slot><slot name='overlay' ></slot></div>",
};
const globalComponents = {
  "a-button": mockComponent,
  "a-dropdown-button": dropdownComponent,
  "a-menu": mockComponent,
  "router-link": mockComponent,
  "a-menu-item": mockComponent,
};
let wrapper: VueWrapper<any>;
describe("UserProfile component", () => {
  beforeAll(() => {
    jest.useFakeTimers();
    wrapper = mount(UserProfile, {
      props: {
        user: { isLogin: false, userName: "xiaobai" },
      },
      global: {
        components: globalComponents,
        
        provide: {
          store,
        },
      },
    });
  });
  it("当login为false时,正确渲染login按钮", async () => {
    console.log(wrapper.html());
    expect(wrapper.get("div").text()).toBe("登录");
    await wrapper.get("div").trigger("click");
    expect(message.success).toHaveBeenCalled();
    expect(store.state.user.userName).toBe("xiaobai");
  });
  it("当login为true时,正确渲染用户名", async () => {
    
    await wrapper.setProps({ user: { isLogin: true, userName: "xiaohei" } });
    console.log(wrapper.html());
    expect(wrapper.get(".user-profile-component").html()).toContain("xiaohei");
    expect(wrapper.find(".user-profile-dropdown").exists()).toBeTruthy();
  });
  it("当退出登录时,展示信息,在两秒后调用router.push方法", async () => {
    await wrapper.get(".user-profile-dropdown div").trigger("click");
    expect(store.state.user.isLogin).toBeFalsy();
    expect(message.success).toHaveBeenCalledTimes(1);
    jest.runAllTimers();
    expect(mockedRoutes).toEqual(["/"]);
  });
  afterEach(() => {
    
    (message as jest.Mocked<typeof message>).success.mockReset();
  });
});