(수근수근)

TDD로 하는 API 서버 개발 -(2) 본문

type & Javascript

TDD로 하는 API 서버 개발 -(2)

InformationFarm 2021. 10. 16. 14:25

 

.해당 내용은 인프런의 '테스트주도개발(TDD)로 만드는 NodeJS API 서버'를 정리한 내용입니다.

사용자 삭제 API 성공시 - DELETE /users/:id

  • 성공시
    204를 응답한다
  • 실패시
    id가 숫자가 아닐 경우 400으로 응답한다

 

📕  DELETE /users/:id 성공시 코드

app.delete('/users/:id', (req, res) =>{
  const id = parseInt(req.params.id, 10);
  users = users.filter(user => user.id !==id);
  res.status(204).end();
})

 

🧩 DELETE /users/:id 성공시 테스트 코드

describe('Delete /users/1', ()=>{
    describe('성공시', ()=>{
        it('204를 응답한다',(done)=>{
            request(app)
                .delete('/users/1')
                .expect(204)
                .end(done);
        })
    })
})

→ 결과


 

📕 DELETE /users/:id 실패시 코드

app.delete('/users/:id', (req, res) =>{
  const id = parseInt(req.params.id, 10);
  if(Number.isNaN(id)) return res.status(400).end();
  users = users.filter(user => user.id !==id);
  res.status(204).end();
})

 

🧩 DELETE /users/:id 실패시 테스트 코드

describe('실패시', () =>{
    it('id가 숫자가 아닐경우 400으로 응답한다',done =>{
        request(app)
            .delete('/users/one')
            .expect(400)
            .end(done);
    })
})

→ 결과


 

사용자 정보 수정 API - POST

  • 성공
    201 상태코드를 반환한다.
    생성된 유저 객체를 반환한다
    입력한 name을 반환한다
  • 실패
    name 파라미터 누락시 400을 반환한다
    name이 중복일 경우 400을 반환한다

 

📕 사용자 추가 API 성공시 코드

app.post('/users', (req, res) =>{
  //express는 body를 지원하지 않음.(4버전 이하, 4이상 부터는 지원한다.)
  //bodyparser 필요
  const name = req.body.name;
  const id = Date.now();
  const user = {id, name};
  users.push(user);
  res.status(201).json(user);
})

 

🧩 사용자 추가 API 성공시 테스트 코드

describe('POST /users',()=>{
    describe('성공시',() =>{
        let name = 'daniel'
        let body;
        //테스트가 동작하기 전에 미리 실행
        before(done => {
            request(app)
                .post('/users')
                .send({name})
                .expect(201)
                .end((err,res) =>{
                    body = res.body;
                    done();
                });
        }) 
        it('생성된 유저 객체를 반환한다', () => {
          body.should.have.property('id');
        });
        it('입력한 name을 반환한다', () => {
            body.should.have.property('name', name)
        })
    })
})

→ 결과


 

📕 사용자 추가 API 실패시 코드

app.post('/users', (req, res) =>{
  //express는 body를 지원하지 않음.
  //bodyparser 필요
  const name = req.body.name;

  if(!name) return res.status(400).end();

  //중복된 데이터인지 확인
  const isConflict = users.filter(user => user.name === name).length;
  if(isConflict) return res.status(409).end();

  const id = Date.now();
  const user = {id, name};
  users.push(user);
  res.status(201).json(user);
})

 

🧩 사용자 추가 API 실패시 테스트 코드

describe('실패시',()=>{
        it('name파라미터를 누락시 400을 반환한다',(done)=>{
            request(app)
                .post('/users')
                .send({})
                .expect(400)
                .end(done)
        })
        it('name이 중복일 경우 409을 반환한다', (done) =>{
            request(app)
                .post('/users')
                .send({name :'세하'})
                .expect(409)
                .end(done)
        })
    })

→ 결과


사용자 정보 수정 API - POST

  • 성공
    변경된 name을 응답한다
  • 실패
    정수가 아닌 id인 결우 400 응답
    name이 없을 경우 400 응답
    없는 유저인 경우 404 응답
    이름이 중복일 경우 409 응답

📕 사용자 정보 수정 API 성공시 코드 - 'PUT /users/:id'

app.put('/users/:id', (req, res) =>{
  const id  = parseInt(req.params.id , 10);
  const name = req.body.name;

  const user = users.filter(user => user.id === id)[0];
  user.name = name;

  res.json(user);
})

🧩 사용자 정보 수정 API 성공시 테스트코드 - 'PUT /users/:id'

describe('PUT /users/:id', () => {
    describe('성공시', () => { 
        it('변경된 name을 응답한다', (done) => {
            const name = '심민하';
            request(app)
                .put('/users/3')
                .send({name})
                .end((err, res) => {
                    res.body.should.have.property('name',name);
                    done();
                });
        })
    })
})

→ 성공


📕 사용자 정보 수정 API 실패시 코드 - 'PUT /users/:id'

 

app.put('/users/:id', (req, res) =>{
  const id  = parseInt(req.params.id , 10);
  //id가 정수인지 아닌지
  if(Number.isNaN(id)) return res.status(400).end();


  const name = req.body.name;
  // 실패 테스트 - 이름이 없는 경우 
  if(!name) return res.status(400).end();

  //user 중복이 되는지 확인
  const isConfilct = users.filter(user => user.name === name).length;
  if(isConfilct) return res.status(409).end();

  const user = users.filter(user => user.id === id)[0];
  if(!user) return res.status(404).end();
  user.name = name;

  res.json(user);
})

 

🧩 사용자 정보 수정 API 실패시 테스트 코드 - 'PUT /users/:id'

 

describe('실패시', ()=>{
        it('정수가 아닌 id인 경우 400을 응답한다', done=>{
            request(app)
                .put('/users/one')
                .expect(400)
                .end(done);
        })
        it('name이 없을 경우 400을 응답한다', done=>{
            request(app)
                .put('/users/1')
                .send({})
                .expect(400)
                .end(done);
        })
        it('없는 유저일 경우', done=>{
            request(app)
                .put('/users/999')
                .send({name:'foo'})
                .expect(404)
                .end(done);
        })
        it('이름이 줌복일 경우', done=>{
            request(app)
                .put('/users/3')
                .send({name:'심민하'})
                .expect(409)
                .end(done);
        })
    })

→ 결과

Comments