// 테스트 하기 위해 흉내만 내는 함수

const mockFn = jest.fn(); // mok 함수 생성
mockFn();
mockFn(1);

test("함수는 2번 호출됩니다", () => {
  expect(mockFn.mock.calls.length).toBe(2); // calls 의 길이는 호출된 횟수
});

test("2번째로 호출된 함수에 전달된 첫번째 인수는 1입니다.", () => {
  expect(mockFn.mock.calls[1][0]).toBe(1);
});

// Test Suites: 1 passed, 1 total
// Tests:       2 passed, 2 total
const mockFn = jest.fn(); // mok 함수 생성

function forEachAdd1(arr) {
  arr.forEach((num) => {
    mockFn(num + 1); // 빠르고 간단한 테스트를 위해서 목함수 사용 해 보자.
  });
}

forEachAdd1([10, 20, 30]);
test("함수 호출은 3번 됩니다.", () => {
  expect(mockFn.mock.calls.length).toBe(3);
});

test("전달 된 값은 11, 21, 31 입니다.", () => {
  expect(mockFn.mock.calls[0][0]).toBe(11);
  expect(mockFn.mock.calls[1][0]).toBe(21);
  expect(mockFn.mock.calls[2][0]).toBe(31);
});

// Test Suites: 1 passed, 1 total
// Tests:       2 passed, 2 total
const func = require("./func"); // func.js 요청

const mockFn = jest.fn((num) => num + 1); // 첫번째 인자로 함수를 넘겨준다.

mockFn(10);
mockFn(20);
mockFn(30);
// results 에는 return 된 값이 배열로 들어간다.

test("10에서 1 증가한 값이 반환된다.", () => {
  console.log(mockFn.mock.results[0]); // { type: 'return', value: 11 }
  expect(mockFn.mock.results[0].value).toBe(11);
});

test("20에서 1 증가한 값이 반환된다.", () => {
  console.log(mockFn.mock.results[1]); // { type: 'return', value: 21 }
  expect(mockFn.mock.results[1].value).toBe(21);
});
test("30에서 1 증가한 값이 반환된다.", () => {
  console.log(mockFn.mock.results[2]); // { type: 'return', value: 31 }
  expect(mockFn.mock.results[2].value).toBe(31);
})
const func = require("./func"); // func.js 요청

const mockFn = jest.fn(); // mok 함수 생성

// 실행 할 때마다 다른 값을 return 해 줄수도 있다.
// 중간에 return 값을 바꾸려면 once 를 붙여주면 된다.

mockFn
  .mockReturnValueOnce(10)
  .mockReturnValueOnce(20)
  .mockReturnValueOnce(30)
  .mockReturnValue(40);

mockFn();
mockFn();
mockFn();
mockFn();

test("dd", () => {
  console.log(mockFn.mock.results);
  expect("dd").toBe("dd");
});

console.log
    [
      { type: 'return', value: 10 },
      { type: 'return', value: 20 },
      { type: 'return', value: 30 },
      { type: 'return', value: 40 }
    ]
// test 할 때마다 user 를 생성 하는건 비효율적이다. 그렇다고 만든 다음 다시 rollback 하는것도
// 그럴 때 사용가능
const func = require("./func"); // func.js 요청
jest.mock('/func'); // func 를 모킹 모듈로 만든다.
func.createUser.mockReturnValue({name: "malza"});
// 실제로 func 의 createUser가 호출 되는 것이 아니다. {name: "malza"} 객체를 반환해주는
// mok 함수가 실행 될 뿐이다.

test("유저를 만든다", () =>{
	const user = func.createUser("malza");
	expect(user.name).toBe("malza");
});
const func = require("./func"); // func.js 요청

const mockFn = jest.fn(); // mok 함수 생성

mockFn(10, 20);
mockFn();
mockFn(30, 40, 50);

// 한번이라도 통과되었다면 통과
test("한번 이상 호출?", () => {
  expect(mockFn).toBeCalled();
});

test("몇 번 호출?", () => {
  expect(mockFn).toBeCalledTimes(3);
});

// 인수로 어떤 값을 전달받았는지 체크
test("10이랑 20 전달 받은 함수가 있는가?", () => {
  expect(mockFn).toBeCalledWith(10, 20);
});

// 인수를 체크하는건 동일하지만 마지막에 받은 인수를 체크한다
test("마지막 함수는 30, 40, 50 을 받았는가?", () => {
  expect(mockFn).lastCalledWith(30, 40, 50);
});

// Test Suites: 1 passed, 1 total
// Tests:       4 passed, 4 total