Kubaryt
Kubaryt

Reputation: 1

Seaorm mock database tests fail due to insertion of row in table with autoincrement pk column

so this is mock db test which has this error


#[actix_web::test]

async fn create_team_success() {

    Config::load_test_config();



    let uuid = uuid::Uuid::new_v4();



    let example_user = users::Model {

        id: uuid,

        username: "Salieri".to_string(),

        email: "[email protected]".to_string(),

        created_at: Default::default(),

        team_name: None,

        permissions: None,

        is_leader: false,

        password: None,

    };



    let database = MockDatabase::new(DatabaseBackend::Postgres)

        .append_query_results(vec![vec![example_user.clone()]])

        .append_query_results(vec![Vec::<teams::Model>::new()])

        .append_query_results(vec![vec![example_user.clone()]])

        .append_query_results(vec![vec![example_user]])

        .append_query_results(vec![Vec::<teams::Model>::new()])

        .append_exec_results([sea_orm::MockExecResult {

            last_insert_id: 15,

            rows_affected: 1,

        }])

        .append_exec_results([sea_orm::MockExecResult {

            last_insert_id: 15,

            rows_affected: 1,

        }])

        .into_connection();



    let app = test::init_service(

        App::new()

            .app_data(Data::new(AppState::with_database(database)))

            .service(scope("/teams").configure(routes::teams::config)),

    )

    .await;



    let create_team_payload = json!({

        "team_name": "Dziengiel".to_string(),

    });



    let access_token = encode_jwt(uuid, "[email protected]".to_string(), Duration::minutes(10));



    let request = test::TestRequest::post()

        .uri("/teams/manage/create_team")

        .set_json(&create_team_payload)

        .insert_header((

            header::COOKIE,

            format!("access_token={}", access_token.unwrap()),

        ))

        .to_request();



    let response = test::call_service(&app, request).await;



    // panic!("{:?}", response.into_body());

    assert_eq!(response.status(), 200);

}

it calls endpoint which basically calls this method of teams model


pub async fn create_team(

        database: &DatabaseConnection,

        create_team_json: CreateTeamModel,

        claim_data: Claims,

    ) -> Result<(), Error> {

        let user = users::Entity::find_by_id(claim_data.id)

            .one(database)

            .await?

            .ok_or(Error::Unauthorized)?;



        if let Some(team_name) = user.team_name {

            return Err(Error::Team(UserAlreadyBelongsToTeam { team_name }));

        }



        if teams::Entity::find()

            .filter(teams::Column::Name.eq(&create_team_json.team_name))

            .one(database)

            .await?

            .is_some()

        {

            return Err(Error::Team(AlreadyExists));

        }



        let transaction = database.begin().await?;



        let team_name = create_team_json.team_name;



        //error occurs here
teams::Entity::insert(teams::ActiveModel {

            name: Set(team_name.clone()),

            ..Default::default()

        })

        .exec(&transaction)

        .await?;



        let mut active_user: users::ActiveModel = user.into();

        active_user.team_name = Set(Some(team_name.clone()));

        active_user.is_leader = Set(true);

        active_user.update(&transaction).await?;



        transaction.commit().await?;



        Ok(())

    }

error this occurs in insertion of new team (i put comment there) (i cant put images directly due to too low rep so here is link)

i tried removing autoincrement from this column and it made tests pass without this error with insertion hardsetting value instead of making it default didn't fix it

if you want to see all of code like migrations or other entities here is link to repo

Upvotes: 0

Views: 27

Answers (0)

Related Questions