# t/userloading.t
#
# Test LJ::load_user and LJ::load_userid.
#
# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.

use strict;
use warnings;

use Test::More tests => 40;

BEGIN { $LJ::_T_CONFIG = 1; require "$ENV{LJHOME}/cgi-bin/ljlib.pl"; }
use FindBin qw($Bin);
use LJ::Test qw(memcache_stress);

my $sysid = LJ::load_user("system")->{userid};
ok( $sysid, "have a systemid" );

memcache_stress(
    sub {
        LJ::start_request();
        is_empty();

        my $u = LJ::load_user("system");
        ok( $u, "Have system user" );
        die unless $u;

        my $u2 = LJ::load_userid( $u->{userid} );
        is( $u, $u2, "whether loading by name or userid, \$u objects are singletons" );

        my $bogus_bday = 9999999;
        $u2->{bdate} = $bogus_bday;

        is( $u->{bdate}, $bogus_bday, "setting bdate to bogus" );

        # this forced load will use the same memory address as our other $u of
        # the same id
        my $uf = LJ::load_userid( $u->{userid}, "force" );
        is( $u, $uf, "forced userid load is u2" );
        isnt( $u2->{bday}, $bogus_bday, "our u2 bday is no longer bogus" );

        my $uf2 = LJ::load_user( "system", "force" );
        is( $uf2, $uf, "forced system" );

        # test user updates by changing 'name'
        my $name;
        {
            $name = "My name is " . rand();
            $u->update_self( { name => $name } );
            is( $u->{name}, $name, "name changed after update" );

            $name = "My name is " . rand();
            $u->update_self( { raw => "name='$name'" } );
            is( $u->{name}, $name, "name changed after raw update" );
        }

        # we'll manually modify the user row, then load with raw
        {
            my $dbh = LJ::get_db_writer();

            $name = "My name is " . rand();
            $dbh->do( "UPDATE user SET name=? WHERE userid=?", undef, $name, $u->{userid} );
            $u = LJ::DB::require_master( sub { LJ::load_user( $u->{user} ) } );
            is( $u->{name}, $name, "name correct after change + load_user" );

            $name = "My name is " . rand();
            $dbh->do( "UPDATE user SET name=? WHERE userid=?", undef, $name, $u->{userid} );
            $u = LJ::DB::require_master( sub { LJ::load_userid( $u->{userid} ) } );
            is( $u->{name}, $name, "name correct after change + load_user" );

            $name = "My name is " . rand();
            $dbh->do( "UPDATE user SET name=? WHERE userid=?", undef, $name, $u->{userid} );
            my $users = LJ::DB::require_master( sub { LJ::load_userids( $u->{userid} ) } );
            $u = $users->{ $u->{userid} };
            is( $u->{name}, $name, "name correct after change + load_user" );
        }
    }
);

sub is_empty {
    is( scalar keys %LJ::REQ_CACHE_USER_NAME, 0, "reqcache for users is empty" );
    is( scalar keys %LJ::REQ_CACHE_USER_ID,   0, "reqcache for userids is empty" );
}

sub run_tests {
    my $up;
    LJ::start_request();
    is_empty();
    my $u = LJ::load_user("system");
    ok( $u, "Have system user" );
    die unless $u;

    my $u2 = LJ::load_userid( $u->{userid} );
    is( $u, $u2, "whether loading by name or userid, \$u objects are singletons" );
}
