--
-- packages/acs-kernel/sql/test/rel-segments-test.sql
--
-- @author oumi@arsdigita.com
-- @creation-date 2000-12-01
-- @cvs-id rel-segments-test.sql,v 1.1.4.1 2001/01/12 23:06:33 oumi Exp
--

-- set serveroutput on

create table groups_test_groups (
       group_id      integer,
       sorder        integer,
       gname         varchar(100)
);

create table groups_test_users (
       user_id     integer,
       sorder      integer,
       uname       varchar(100)
);

create table groups_test_segs (
       seg_id      integer,
       sorder      integer,
       sname       varchar(100)
);

-- creates blah_member_rel and yippie_member_rel relationships

\i rel-segments-test-types-create.sql




-- added
select define_function_args('rel_segment_test_check','segment_id,party_id,container_id');

--
-- procedure rel_segment_test_check/3
--
CREATE OR REPLACE FUNCTION rel_segment_test_check(
   test_check__segment_id integer,
   test_check__party_id integer,
   test_check__container_id integer
) RETURNS boolean AS $$
DECLARE
  v_pass_p                          boolean;
  str                               text;
BEGIN

  select count(*) > 0 into v_pass_p
  from rel_segment_party_map
  where segment_id = test_check__segment_id
  and party_id = test_check__party_id
  and container_id = test_check__container_id;

  if NOT v_pass_p then

      str := 'Row missing from rel_segment_party_map for' ||
                    ' segment ' || 
                    acs_object__name(test_check__segment_id) ||
                    ' (' || test_check__segment_id || ')' ||
                    ', party ' || 
                    acs_object__name(test_check__party_id) || 
                    ' (' || test_check__party_id || ')' ||
                    ', container ' || 
                    acs_object__name(test_check__container_id) || 
                    ' (' || test_check__container_id || ')';

      raise NOTICE '%', str;

      PERFORM acs_log__error('rel_segment_test_check', str);
  end if;


  return v_pass_p;

END;
$$ LANGUAGE plpgsql; 




--
-- procedure test_segs/0
--
CREATE OR REPLACE FUNCTION test_segs(

) RETURNS integer AS $$
DECLARE
  A      integer;
  B      integer;
  C      integer;
  D      integer;
  E      integer;
  F      integer;
  G      integer;

  joe    integer;
  jane   integer;
  bob    integer;
  betty  integer;
  jack	 integer;
  jill	 integer;
  sven	 integer;
  stacy	 integer;

  seg_G_blahs    integer;
  seg_E_yippies  integer;
  seg_F          integer;

  rel_id integer;
BEGIN
  -- Create the test groups.

  A := acs_group__new('A');
  B := acs_group__new('B');
  C := acs_group__new('C');
  D := acs_group__new('D');
  E := acs_group__new('E');
  F := acs_group__new('F');
  G := acs_group__new('G');

  insert into groups_test_groups values (A,1,'A');
  insert into groups_test_groups values (B,2,'B');
  insert into groups_test_groups values (C,3,'C');
  insert into groups_test_groups values (D,4,'D');
  insert into groups_test_groups values (E,5,'E');
  insert into groups_test_groups values (F,6,'F');  
  insert into groups_test_groups values (G,7,'G');

  -- Create the test members.
  joe   := acs_user__new('joe@asdf.com','Joe',
                         'Smith','assword','p');
  jane  := acs_user__new('jane@asdf.com','Jane',
                         'Smith','assword','p');
  bob   := acs_user__new('bob@asdf.com','Bob',
                         'Smith','assword','p');
  betty := acs_user__new('betty@asdf.com','Betty',
                         'Smith','assword','p');
  jack  := acs_user__new('jack@asdf.com','Jack',
                         'Smith','assword','p');
  jill  := acs_user__new('jill@asdf.com','Jill',
                         'Smith','assword','p');
  sven  := acs_user__new('sven@asdf.com','Sven',
                         'Smith','assword','p');
  stacy := acs_user__new('stacy@asdf.com','Stacy',
                         'Smith','assword','p');

  insert into groups_test_users values (joe,1,'joe');
  insert into groups_test_users values (jane,2,'jane');
  insert into groups_test_users values (bob,3,'bob');
  insert into groups_test_users values (betty,4,'betty');
  insert into groups_test_users values (jack,5,'jack');
  insert into groups_test_users values (jill,6,'jill');  
  insert into groups_test_users values (sven,7,'sven');
  insert into groups_test_users values (stacy,8,'stacy');

  -- Make a couple of compositions.

  rel_id := composition_rel__new(A, B);
  rel_id := composition_rel__new(A, C);
  rel_id := composition_rel__new(A, D);

  rel_id := composition_rel__new(E, A);
  rel_id := composition_rel__new(F, A);
  rel_id := composition_rel__new(G, A);

  -- Make a couple of memberships.

  rel_id := blah_member_rel__new(null, 'blah_member_rel', B, joe);
  rel_id := yippie_member_rel__new(null, 'yippie_member_rel', B, jane);
  rel_id := blah_member_rel__new(null, 'blah_member_rel', B, betty);
  rel_id := yippie_member_rel__new(null, 'yippie_member_rel', A, bob);
  rel_id := blah_member_rel__new(null, 'blah_member_rel', A, betty);
  rel_id := yippie_member_rel__new(null, 'yippie_member_rel', E, betty);

  -- define a few segments.

  -- the segment of all parties that are blah members of G
  seg_G_blahs := rel_segment__new(null,
                                  'rel_segment',
                                  now(),
                                  null,
                                  null,
                                  null,
                                  null,                                  
                                  'Blahs of Group G',
                                  G, 
                                  'blah_member_rel',
                                  null
                 );

  -- the segment of all parties that are yippie members of E
  seg_E_yippies := rel_segment__new(null,
                                  'rel_segment',
                                  now(),
                                  null,
                                  null,
                                  null,
                                  null,
                                  'Yippies of Group E',
                                  E, 
                                  'yippie_member_rel',
                                  null
                  );

  seg_F := rel_segment__get_or_new(F,'membership_rel',null);

  insert into groups_test_segs values (seg_G_blahs,1,'seg_G_blahs');
  insert into groups_test_segs values (seg_E_yippies,2,'seg_E_yippies');
  insert into groups_test_segs values (seg_F,3,'seg_F');

  delete from acs_logs;

  return null;

END;
$$ LANGUAGE plpgsql;



--
-- procedure check_segs/0
--
CREATE OR REPLACE FUNCTION check_segs(

) RETURNS integer AS $$
DECLARE
  A      integer;
  B      integer;
  C      integer;
  D      integer;
  E      integer;
  F      integer;
  G      integer;

  joe    integer;
  jane   integer;
  bob    integer;
  betty  integer;
  jack	 integer;
  jill	 integer;
  sven	 integer;
  stacy	 integer;

  seg_G_blahs    integer;
  seg_E_yippies  integer;
  seg_F          integer;

  rel_id integer;
  r      record;
  str    varchar;
BEGIN

  select group_id into A from groups_test_groups where gname = 'A';
  select group_id into B from groups_test_groups where gname = 'B';
  select group_id into C from groups_test_groups where gname = 'C';
  select group_id into D from groups_test_groups where gname = 'D';
  select group_id into E from groups_test_groups where gname = 'E';
  select group_id into F from groups_test_groups where gname = 'F';
  select group_id into G from groups_test_groups where gname = 'G';

  select user_id into joe   from groups_test_users where uname = 'joe';
  select user_id into jane  from groups_test_users where uname = 'jane';
  select user_id into bob   from groups_test_users where uname = 'bob';
  select user_id into betty from groups_test_users where uname = 'betty';
  select user_id into jack  from groups_test_users where uname = 'jack';
  select user_id into jill  from groups_test_users where uname = 'jill';
  select user_id into sven  from groups_test_users where uname = 'sven';
  select user_id into stacy from groups_test_users where uname = 'stacy';

  select seg_id into seg_G_blahs  
    from groups_test_segs 
   where sname = 'seg_G_blahs';

  select seg_id into seg_E_yippies 
    from groups_test_segs 
   where sname = 'seg_E_yippies';

  select seg_id into seg_F 
    from groups_test_segs 
   where sname = 'seg_F';

--  group_element_index_dump;
--  rel_segment_party_map_dump;


  -- Expectations:
  --   1. seg_G_blahs should include joe and betty
  --   2. seg_E_yippies should include bob, and jane, betty

  -- check: seg_G_blahs contains joe with container B
  if rel_segment_test_check(seg_G_blahs, joe, B) = 'f' then
    str := 'Segment ' || acs_object__name(seg_G_blahs) || 
                         '(' || seg_G_blahs || ') failed.   Group_id = ' 
                         || G;
    raise NOTICE '%', str; 
  end if;

  -- check: seg_G_blahs contains betty with container B
  if rel_segment_test_check(seg_G_blahs, betty, B) = 'f' then
    str := 'Segment ' || acs_object__name(seg_G_blahs) || 
                         '(' || seg_G_blahs || ') failed.  Group_id = ' 
                         || G;
    raise NOTICE '%', str; 
  end if;

  -- check: seg_G_blahs contains betty with container A
  if rel_segment_test_check(seg_G_blahs, betty, A) = 'f' then
    str := 'Segment ' || acs_object__name(seg_G_blahs) || 
                         '(' || seg_G_blahs || ') failed.  Group_id = ' 
                         || G;
    raise NOTICE '%', str; 
  end if;

  -- check: seg_E_yippies contains jane with container B
  if rel_segment_test_check(seg_E_yippies, jane, B) = 'f' then
    str := 'Segment ' || acs_object__name(seg_E_yippies) || 
                         '(' || seg_E_yippies || ') failed.  Group_id = ' 
                         || E;
    raise NOTICE '%', str; 
  end if;

  -- check: seg_E_yippies contains bob with container A
  if rel_segment_test_check(seg_E_yippies, bob, A) = 'f' then
    str := 'Segment ' || acs_object__name(seg_E_yippies) || 
                         '(' || seg_E_yippies || ') failed. Group_id = ' 
                         || E;
    raise NOTICE '%', str; 
  end if;

  -- check: seg_E_yippies contains betty with container E
  if rel_segment_test_check(seg_E_yippies, betty, E) = 'f' then
    str := 'Segment ' || acs_object__name(seg_E_yippies) || 
                         '(' || seg_E_yippies || ') failed. Group_id = ' 
                         || E;
    raise NOTICE '%', str; 
  end if;

  -- Now we test on-the-fly creation of rel-segments with the get_or_new
  -- function:

  -- The segment of all memers of F should contain jane through group B
  if rel_segment_test_check(seg_F, jane, B) = 'f' then
    str := 'Segment ' || 
                 acs_object__name(rel_segment__get(F,'membership_rel')) || 
                 '(' || rel_segment__get(F,'membership_rel') 
                 || ') failed. Group_id = ' || F;
    raise NOTICE '%', str; 
  end if;

  -- The segment of all memers of F should contain betty through group A
  if rel_segment_test_check(seg_F, betty, A) = 'f' then
    str := 'Segment ' || 
                 acs_object__name(rel_segment__get(F,'membership_rel')) || 
                 '(' || rel_segment__get(F,'membership_rel') 
                 || ') failed. Group_id = ' || A;
    raise NOTICE '%', str; 
  end if;

  -- Remove the test segments.
  PERFORM rel_segment__delete(seg_G_blahs);
  PERFORM rel_segment__delete(seg_E_yippies);
  PERFORM rel_segment__delete(rel_segment__get(F,'membership_rel'));

  -- Remove the test memebership relations
  for r in select * from blah_member_rels LOOP
    PERFORM blah_member_rel__delete(r.rel_id);
  end loop;

  for r in select * from yippie_member_rels LOOP
    PERFORM yippie_member_rel__delete(r.rel_id);
  end loop;

  -- Remove the test groups.
  PERFORM acs_group__delete(G);
  PERFORM acs_group__delete(F);
  PERFORM acs_group__delete(E);
  PERFORM acs_group__delete(D);
  PERFORM acs_group__delete(C);
  PERFORM acs_group__delete(B);
  PERFORM acs_group__delete(A);

  -- Remove the test members.
  PERFORM acs_user__delete(joe);
  PERFORM acs_user__delete(jane);
  PERFORM acs_user__delete(bob);
  PERFORM acs_user__delete(betty);
  PERFORM acs_user__delete(jack);
  PERFORM acs_user__delete(jill);
  PERFORM acs_user__delete(sven);
  PERFORM acs_user__delete(stacy);

  return null;

END;
$$ LANGUAGE plpgsql;

select test_segs();
select check_segs();

drop function rel_segment_test_check(integer, integer, integer);
drop function test_segs();
drop function check_segs();
drop table groups_test_groups;
drop table groups_test_users;
drop table groups_test_segs;

\i rel-segments-test-types-drop.sql

select log_level, log_key, message
from acs_logs
where log_level = 'error';

